IEnumerable<T>是啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IEnumerable<T>是啥意思?相关的知识,希望对你有一定的参考价值。

IEnumerable<T>可以用来干什么?

IEnumerable和IEnumerable<T>接口在.NET中是非常重要的接口,它允许开发人员定义foreach语句功能的实现并支持非泛型方法的简单的迭代,IEnumerable和IEnumerable<T>接口是.NET Framework中最基本的集合访问器。它定义了一组扩展方法,用来对数据集合中的元素进行遍历、过滤、排序、搜索等操作。
IEnumerable接口是非常的简单,只包含一个抽象的方法Get IEnumerator(T),它返回一个可用于循环访问集合的IEnumerator对象。

IEnumerable、IEnumerator、ICollection、IList、List
IEnumerator:提供在普通集合中遍历的接口,有Current,MoveNext(),Reset(),其中Current返回的是object类型。
IEnumerable: 暴露一个IEnumerator,支持在普通集合中的遍历。
IEnumerator<T>:继承自IEnumerator,有Current属性,返回的是T类型。
IEnumerable<T>:继承自IEnumerable,暴露一个IEnumerator<T>,支持在泛型集合中遍历。
参考技术A 这是foreach结构说必须的,因为所有的集合、数组都实现了这个接口因此可以支持foreach。IEnumerable<T>还是从IEnumerable继承而来的,因为.NET 2.0以前没提供IList<T>这样的泛型列表本回答被提问者采纳

如何将两个 IEnumerable<T> 连接成一个新的 IEnumerable<T>?

【中文标题】如何将两个 IEnumerable<T> 连接成一个新的 IEnumerable<T>?【英文标题】:How to concatenate two IEnumerable<T> into a new IEnumerable<T>? 【发布时间】:2012-12-19 08:29:35 【问题描述】:

我有两个IEnumerable&lt;T&gt; 实例(具有相同的T)。我想要一个 IEnumerable&lt;T&gt; 的新实例,它是两者的串联。

.NET 中是否有内置方法可以做到这一点,还是我必须自己编写?

【问题讨论】:

您可能想为code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b添加书签。 相关,如果有帮助:Elegant way to combine multiple collections of elements? 【参考方案1】:

是的,LINQ to Objects 通过Enumerable.Concat 支持这一点:

var together = first.Concat(second);

注意:如果firstsecond 为空,您将收到ArgumentNullException。为了避免这种情况 & 像对待空集一样对待空值,请像这样使用空值合并运算符:

var together = (first ?? Enumerable.Empty<string>()).Concat(second ?? Enumerable.Empty<string>()); //amending `<string>` to the appropriate type

【讨论】:

我总是忘记查找扩展方法,tx。 @SamuelRossille 也不要忘记,如果不完全称为您所追求的,您想要执行的操作的名称可能很接近。总是浏览 IntelliSense,你会学到很多东西。 做 second = first.Concat(second) 不好吗?我们会有任何并发​​问题吗? @user2934433:不,没关系。 只是一个简短的说明。需要在代码文件顶部导入using System.Linq命名空间,才能在IDE intellisense中看到想要的扩展方法。【参考方案2】:

您可以将以下代码用于您的解决方案:-

public void Linq94() 
 
    int[] numbersA =  0, 2, 4, 5, 6, 8, 9 ; 
    int[] numbersB =  1, 3, 5, 7, 8 ; 

    var allNumbers = numbersA.Concat(numbersB); 

    Console.WriteLine("All numbers from both arrays:"); 
    foreach (var n in allNumbers) 
     
        Console.WriteLine(n); 
     

【讨论】:

【参考方案3】:
// The answer that I was looking for when searching
public void Answer()

    IEnumerable<YourClass> first = this.GetFirstIEnumerableList();
    // Assign to empty list so we can use later
    IEnumerable<YourClass> second = new List<YourClass>();

    if (IwantToUseSecondList)
    
        second = this.GetSecondIEnumerableList();  
    
    IEnumerable<SchemapassgruppData> concatedList = first.Concat(second);

【讨论】:

这似乎只是对现有答案的重复。【参考方案4】:

Concat 方法将返回一个实现IEnumerable&lt;T&gt; 的对象,方法是返回一个对象(称为 Cat),该对象的枚举器将尝试按顺序使用传入的两个可枚举项(称为 A 和 B)。如果传入的可枚举表示的序列在 Cat 的生命周期内不会改变,并且可以从没有副作用的情况下读取,则可以直接使用 Cat。否则,最好在 Cat 上调用 ToList() 并使用生成的 List&lt;T&gt;(这将代表 A 和 B 内容的快照)。

一些可枚举对象在枚举开始时拍摄快照,如果在枚举期间修改了集合,则会从该快照返回数据。如果 B 是这样一个可枚举的,那么在 Cat 到达 A 末尾之前发生的对 B 的任何更改都将显示在 Cat 的枚举中,但之后发生的更改不会。这样的语义可能会令人困惑;拍摄 Cat 的快照可以避免此类问题。

【讨论】:

【参考方案5】:

我知道这是一篇比较老的帖子,但如果你想连接多个 IEnumerable,我使用以下

var joinedSel = new[]  first, second, third .Where(x => x != null).SelectMany(x => x);

这消除了任何空 IEnumerable 并允许多个连接。

【讨论】:

以上是关于IEnumerable<T>是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

将 IEnumerable<Ienumerable<T>> 转换为 Dictionary<key,IEnumerable<T>>

如何将两个 IEnumerable<T> 连接成一个新的 IEnumerable<T>?

无法将类型“IEnumerable<T>”隐式转换为“ActionResult<IEnumerable<T>>”

Expression<Func<T,bool>> 声明是啥意思?

如何将多个 IEnumerable<IEnumerable<T>> 列表添加到 IEnumerable<List<int>>

“QVector<QVector<QVector<T>>> 向量”是啥意思?