【发布时间】:2012-12-19 08:29:35
【问题描述】:
我有两个IEnumerable<T> 实例(具有相同的T)。我想要一个 IEnumerable<T> 的新实例,它是两者的串联。
.NET 中是否有内置方法可以做到这一点,还是我必须自己编写?
【问题讨论】:
标签: c# .net ienumerable concatenation
我有两个IEnumerable<T> 实例(具有相同的T)。我想要一个 IEnumerable<T> 的新实例,它是两者的串联。
.NET 中是否有内置方法可以做到这一点,还是我必须自己编写?
【问题讨论】:
标签: c# .net ienumerable concatenation
是的,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
【讨论】:
using System.Linq命名空间,才能在IDE intellisense中看到想要的扩展方法。
您可以将以下代码用于您的解决方案:-
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 方法将返回一个实现IEnumerable<T> 的对象,方法是返回一个对象(称为 Cat),该对象的枚举器将尝试按顺序使用传入的两个可枚举项(称为 A 和 B)。如果传入的可枚举表示的序列在 Cat 的生命周期内不会改变,并且可以从没有副作用的情况下读取,则可以直接使用 Cat。否则,最好在 Cat 上调用 ToList() 并使用生成的 List<T>(这将代表 A 和 B 内容的快照)。
一些可枚举对象在枚举开始时拍摄快照,如果在枚举期间修改了集合,则会从该快照返回数据。如果 B 是这样一个可枚举的,那么在 Cat 到达 A 末尾之前发生的对 B 的任何更改都将显示在 Cat 的枚举中,但之后发生的更改不会。这样的语义可能会令人困惑;拍摄 Cat 的快照可以避免此类问题。
【讨论】:
我知道这是一篇比较老的帖子,但如果你想连接多个 IEnumerable,我使用以下
var joinedSel = new[] { first, second, third }.Where(x => x != null).SelectMany(x => x);
这消除了任何空 IEnumerable 并允许多个连接。
【讨论】: