.net 如何将两个IEnumerable连接< T>成一个新的IEnumerable< T>?

dly7yett  于 2022-12-20  发布在  .NET
关注(0)|答案(6)|浏览(215)

我有两个IEnumerable<T>的示例(具有相同的T)。我想要一个新的IEnumerable<T>示例,它是两个示例的连接。
NET中是否有内置的方法可以做到这一点,或者我必须自己编写它?

8tntrjer

8tntrjer1#

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

xmd2e60i2#

Concat方法将返回一个对象,该对象通过返回(称之为Cat),其枚举数将尝试使用传入的两个可枚举项(称它们为A和B)。如果传入的枚举对象表示在Cat的生存期内不会更改的序列,并且可以从其中读取而没有副作用,则可以直接使用Cat。否则,在Cat上调用ToList()并使用结果List<T>(它将表示A和B的内容的快照)可能是一个好主意。
某些可枚举项在枚举开始时获取快照,并且如果集合在枚举期间被修改,则将从该快照返回数据。如果B是这样的可枚举项,则在Cat到达A末尾之前发生的对B的任何更改将显示在Cat的枚举中,但在此之后发生的更改将不会显示。此类语义可能会引起混淆;拍摄Cat快照可以避免此类问题。

kq0g1dla

kq0g1dla3#

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

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

brccelvz4#

我知道这是一篇相对较老的文章,但是如果您希望连接多个IEnumerable,我将使用以下代码

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

这将消除任何空IEnumerable,并允许多个串联。

gpnt7bae

gpnt7bae5#

基于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>();
    }
olhwl3o2

olhwl3o26#

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

相关问题