我有两个相同的 IEnumerable<T>
实例,我想要一个新的 IEnumerable<T>
实例,它是这两个实例的连接。
在.NET中是否有内置的方法可以完成此操作,还是我必须自己编写代码实现?
我有两个相同的 IEnumerable<T>
实例,我想要一个新的 IEnumerable<T>
实例,它是这两个实例的连接。
在.NET中是否有内置的方法可以完成此操作,还是我必须自己编写代码实现?
是的,LINQ to Objects 支持使用 Enumerable.Concat
实现此功能:
var together = first.Concat(second);
NB: 如果first
或second
为空,您将收到一个ArgumentNullException
。为了避免这种情况并将null视为您对空集的处理方式,请使用Null合并运算符,例如:
var together = (first ?? Enumerable.Empty<string>()).Concat(second ?? Enumerable.Empty<string>()); //amending `<string>` to the appropriate type
using System.Linq
命名空间以在IDE智能感知中查看所需的扩展方法。 - RBTConcat
方法将返回一个实现了 IEnumerable<T>
接口的对象,通过返回一个对象(称其为 Cat),它的枚举器将尝试按顺序使用传入的两个可枚举项(称其为 A 和 B)。如果传入的可枚举项代表的序列在 Cat 的生命周期内不会发生更改,并且可以在没有副作用的情况下读取,则可以直接使用 Cat。否则,最好在 Cat
上调用 ToList()
并使用生成的 List<T>
(它将表示 A 和 B 内容的快照)。我知道这是一个相对较旧的帖子,但如果你想连接多个IEnumerable,我使用以下方法:
var joinedSel = new[] { first, second, third }.Where(x => x != null).SelectMany(x => x);
这将消除任何空的IEnumerable,并允许进行多次串联。
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);
}
}
基于craig1231的答案,我创建了一些扩展方法...
public static IEnumerable<T> JoinLists<T>(this IEnumerable<T> list1, IEnumerable<T> list2)
{
var joined = new[] { list1, list2 }.Where(x => x != null).SelectMany(x => x);
return joined ?? Enumerable.Empty<T>();
}
public static IEnumerable<T> JoinLists<T>(this IEnumerable<T> list1, IEnumerable<T> list2, IEnumerable<T> list3)
{
var joined = new[] { list1, list2, list3 }.Where(x => x != null).SelectMany(x => x);
return joined ?? Enumerable.Empty<T>();
}
public static IEnumerable<T> JoinMany<T>(params IEnumerable<T>[] array)
{
var final = array.Where(x => x != null).SelectMany(x => x);
return final ?? Enumerable.Empty<T>();
}
// 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);
}