我有IEnumerable<T>
的两个实例(具有相同的T
)。我想要一个IEnumerable<T>
的新实例,它是两者的串联。
.Net中是否有内置方法来执行此操作,还是我必须自己编写?
答案 0 :(得分:262)
是的,LINQ to Objects通过Enumerable.Concat
支持此功能:
var together = first.Concat(second);
注意:如果first
或second
为空,您将收到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 并允许多个连接。