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

Sam*_*lle 183 .net c# ienumerable concatenation

我有两个IEnumerable<T>(相同T)的实例.我想要一个新的实例IEnumerable<T>是两者的串联.

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

Jon*_*eet 301

是的,LINQ to Objects支持以下功能Enumerable.Concat:

var together = first.Concat(second);
Run Code Online (Sandbox Code Playgroud)

注意:应该first或者second为空,你会得到一个ArgumentNullException.要避免这种情况并像处理空集一样处理空值,请使用null合并运算符,如下所示:

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

  • @SamuelRossille同样不要忘记,如果没有完全调用你所追求的内容,那么你想要执行的动作的名称可能很接近.总是浏览IntelliSense,你学到了很多东西. (9认同)
  • @ user2934433:不,这绝对没问题. (4认同)
  • 我总是忘记查找扩展方法,tx。 (2认同)
  • 做第二次= first.Concat(第二次)是不是很糟糕?我们会遇到任何并发问题吗? (2认同)
  • 快速说明一下.需要在代码文件的顶部导入`using System.Linq`命名空间,以在IDE intellisense中查看所需的扩展方法. (2认同)

sup*_*cat 18

Concat方法将返回一个对象,该对象IEnumerable<T>通过返回一个对象(称为Cat)来实现,该对象的枚举器将尝试按顺序使用两个传入的可枚举项(称为A和B).如果传入的可枚举代表在Cat的生命周期内不会改变的序列,并且可以在没有副作用的情况下读取,则可以直接使用Cat.否则,它可能是一个好主意,调用ToList()Cat,并使用所得到的List<T>(其将代表的A和B的内容的快照).

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


cra*_*231 11

我知道这是一篇相对较旧的帖子,但如果您想连接多个 IEnumerable,我使用以下内容

var joinedSel = new[] { first, second, third }.Where(x => x != null).SelectMany(x => x);
Run Code Online (Sandbox Code Playgroud)

这消除了任何空 IEnumerable,并允许多重串联。


Jay*_*kla 8

您可以使用以下代码来解决问题: -

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); 
    } 
}
Run Code Online (Sandbox Code Playgroud)