如何将两个IEnumerable <T>连接到新的IEnumerable <T>中?


201

我有IEnumerable<T>(具有相同T)的两个实例。我想要一个新的实例,IEnumerable<T>将两者串联在一起。

.Net中是否有内置方法可以执行此操作,或者我必须自己编写该方法?


9
您可能需要为code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b添加书签。
C-磅大师

Answers:


332

是的,LINQ to Objects支持此功能Enumerable.Concat

var together = first.Concat(second);

注意:您应该收到一个firstsecond为null ArgumentNullException。为了避免这种情况并将空值视为空集,请使用空合并运算符,如下所示:

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

1
我总是忘记查找扩展方法TX。
塞缪尔·罗西耶

10
@SamuelRossille同样也不要忘记,如果要执行的动作名称不正确,则可能要关闭的动作名称也很接近。始终浏览IntelliSense,您会学到很多东西。
亚当·霍兹沃思

3
第二= first.Concat(second)做不好吗?我们会有并发问题吗?
user2934433

4
@ user2934433:不,那很好。
乔恩·斯基特

2
请注意。需要using System.Linq 在代码文件的顶部导入名称空间,以在IDE智能感知中查看所需的扩展方法。
RBT

19

Concat方法将返回一个对象,该对象IEnumerable<T>通过返回一个对象(称为Cat)来实现,该对象的枚举器将尝试依次使用两个传入的可枚举项(称为A和B)。如果传入的可枚举值表示在Cat的使用期限内不会更改的序列,并且可以无副作用地读取,则可以直接使用Cat。否则,它可能是一个好主意,调用ToList()Cat,并使用所得到的List<T>(A和B的内容,这将代表一个快照)。

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


7

您可以使用以下代码作为解决方案:-

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); 
    } 
}

0
// 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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.