【问题标题】:Merge List<T> of the same Type合并相同类型的 List<T>
【发布时间】:2012-01-14 05:20:53
【问题描述】:

我有 2 个列表,它们的定义是:

List<Type> filteredTypes = new List<Type>();
List<Type> interfaceTypes = new List<Type>();

当我的列表被填充时,我想对它们都进行一个循环,我的想法是在“循环”之前合并它们,这样我就不必使用 LINQ(不喜欢它.. .-_-) 我查看了在线文档,我想我必须这样做:

filteredTypes.Concat(interfaceTypes);

我尽可能深入地调试,并且我的列表在指令之后是相同的...... 我错过了什么?

【问题讨论】:

  • 有趣的是,您不喜欢 LINQ,但使用了来自 System.Linq 的方法 Concat
  • 我的意思是 lambda 表达式 :o

标签: c# list


【解决方案1】:

concat 函数returns 是一个新集合,它不会添加到现有集合中。

var allTypes = filteredTypes.Concat(interfaceTypes);

【讨论】:

  • 这对我来说有点奇怪,这两个函数具有相同的“架构”但非常不同......我期待像 Concat(filteredTypes, interfaceTypes) 这样的东西......结构看起来真的(对我来说)filterTypes 是用 Concat 修改的!
  • Enumerable 上的大多数函数都是返回新序列的纯函数,而List 上的大多数函数会改变列表——不同 API 之间的不一致是 C# 和 .NET 的结果非常大,并在十年内逐渐建成。
【解决方案2】:

请看这里:.NET List<T> Concat vs AddRange

.Concat() 调用会创建一个新的List&lt;T&gt;,因此您需要以下内容:

var mergedList = filteredTypes.Concat(interfaceTypes);

【讨论】:

    【解决方案3】:

    Concat 返回一个新列表而不修改任何一个原始列表。如果你想把它放在一个新的列表中,这样做:

    List<Type> newList = filteredTypes.Concat(interfaceTypes);
    

    如果您想将其放入旧列表之一,请使用 AddRange:

    filteredTypes.AddRange(interfaceTypes);
    

    【讨论】:

      【解决方案4】:

      为什么不使用 AddRange?

       filteredTypes.AddRange(interfaceTypes);
      

      【讨论】:

        【解决方案5】:

        IEnumerable&lt;T&gt;.Concat(IEnumerable&lt;T&gt;) 返回IEnumerable&lt;T&gt;.

        试试这个:

        var resultTypes = filteredTypes.Concat(interfaceTypes);
        

        【讨论】:

          【解决方案6】:

          你必须这样做:

          var temp = firstList.Concat(secondList);
          List<Type> finalList = temp.ToList<Type>();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-09
            • 2021-02-01
            • 2016-08-23
            • 2016-08-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多