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

问题描述 投票:0回答:7

我有两个

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

.NET 中有内置方法可以做到这一点还是我必须自己编写?

c# .net ienumerable concatenation
7个回答
463
投票

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

26
投票

Concat
方法将返回一个实现
IEnumerable<T>
的对象,方法是返回一个对象(称为Cat),该对象的枚举器将尝试按顺序使用两个传入的可枚举项(称为A和B)。如果传入的枚举表示在 Cat 生命周期内不会改变的序列,并且可以无副作用地读取,则可以直接使用 Cat。否则,最好在
ToList()
上调用
Cat
并使用生成的
List<T>
(这将代表 A 和 B 内容的快照)。

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


11
投票

我知道这是一篇相对较旧的帖子,但如果您想连接多个 IEnumerable,我使用以下内容

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

这消除了任何空 IEnumerable,并允许多重串联。


10
投票

您可以使用以下代码来解决您的问题:-

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

1
投票

根据 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>();
    }

0
投票

与此同时,C#12 引入了扩展运算符“..”。您可以轻松地将其应用于任何 IEnumerable

IEnumerable<int> enumerableA = [1,2];
IEnumerable<int> enumerableB = [3,4];
IEnumerable<int> merged = [ ..enumerableA, ..enumerableB ];

请参阅:C#12 集合表达式


-3
投票
// 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.