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

时间:2013-01-04 21:07:00

标签: c# .net ienumerable concatenation

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

.Net中是否有内置方法来执行此操作,还是我必须自己编写?

5 个答案:

答案 0 :(得分:262)

是的,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

答案 1 :(得分:16)

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

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

答案 2 :(得分:6)

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

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 :(得分:0)

//The answare 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 :(得分:-1)

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

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

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

相关问题