【问题标题】:How to concatenate two IEnumerable<T> into a new IEnumerable<T>?如何将两个 IEnumerable<T> 连接成一个新的 IEnumerable<T>?
【发布时间】:2012-12-19 08:29:35
【问题描述】:

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

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

【问题讨论】:

标签: c# .net ienumerable concatenation


【解决方案1】:

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

【讨论】:

  • 我总是忘记查找扩展方法,tx。
  • @SamuelRossille 也不要忘记,如果不完全称为您所追求的,您想要执行的操作的名称可能很接近。总是浏览 IntelliSense,你会学到很多东西。
  • 做 second = first.Concat(second) 不好吗?我们会有任何并发​​问题吗?
  • @user2934433:不,没关系。
  • 只是一个简短的说明。需要在代码文件顶部导入using System.Linq命名空间,才能在IDE intellisense中看到想要的扩展方法。
【解决方案2】:

您可以将以下代码用于您的解决方案:-

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

    【讨论】:

    • 这似乎只是对现有答案的重复。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      我知道这是一篇比较老的帖子,但如果你想连接多个 IEnumerable,我使用以下

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

      这消除了任何空 IEnumerable 并允许多个连接。

      【讨论】:

        猜你喜欢
        • 2015-01-19
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多