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

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

在。net中有内置的方法来做这个吗?还是我必须自己写?

165990 次浏览

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

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

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

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

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

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

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

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