248

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

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

4

5 回答 5

406

是的,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
于 2013-01-04T21:07:58.733 回答
22

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

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

于 2014-01-31T17:29:03.577 回答
10

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

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); 
    } 
}
于 2013-09-27T11:31:19.823 回答
-1

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

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

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

于 2021-07-21T09:03:16.777 回答
-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);
}
于 2014-01-31T10:58:23.213 回答