【问题标题】:List<T> Concatenation for 'X' amount of listsList<T> 连接“X”个列表
【发布时间】:2010-03-01 17:32:51
【问题描述】:

例如,我有 5 个列出所有相同类型的列表。我可以简单地做吗

List<T> newset = List1.Concat(List2).Concat(List3).Concat(List4).....

【问题讨论】:

标签: c# linq generics c#-3.0


【解决方案1】:

您可以这样做(尽管最后需要.ToList())。

但是,生成单个列表并使用 AddRange 添加到每个列表中会(稍微)更有效。只需使用所有列表的总大小初始化列表,然后重复调用 AddRange。

您可能需要考虑执行以下操作:

public List<T> ConcatMultiple<T>(this List<T> list, params[] ICollection<T> others)
{
    List<T> results = new List<T>(list.Count + others.Sum(i => i.Count));
    results.AddRange(list);
    foreach(var l in others)
        results.AddRange(l);
    return results;
}

然后调用方式:

List<MyClass> newset = List1.ConcatMultiple(List2, List3, List4);

【讨论】:

  • 将其作为特定列表的扩展方法似乎有点奇怪,因为它返回一个全新的列表并且不会以任何方式影响主列表。
  • @Ilia:这对我来说并不奇怪,因为它在使用方面与 Enumerable.Concat 没有什么不同:msdn.microsoft.com/en-us/library/bb302894.aspx
【解决方案2】:

是的,你可以这样做。

List<Thing> newSet = List1.Concat(List2).Concat(List3).Concat(List4).ToList();

【讨论】:

    【解决方案3】:

    你可以,但不要忘记在最后附加.ToList();。 你也可以打电话给newset.AddRange(ListX); 我认为它在性能方面更好

    【讨论】:

    • 我认为 AddRange 在您已经使用 Lists 时会更好,但如果您使用 IEnumerable 和 LINQ Concat 那么在 ToList() 之前什么都做不了,所以它可能是更高效。
    【解决方案4】:

    如果您想连接任意(以前未知)数量的列表,那么您可能需要连接一组列表。可能最简单的方法是使用 SelectMany 运算符(或 LINQ 查询中的嵌套 from 子句):

    IEnumerable<List<int>> lists = /* get list of lists */;
    List<int> result = lists.SelectMany(e => e).ToList();
    

    SelectMany 运算符为输入列表(这是一个列表)的每个元素调用给定函数,然后连接所有结果列表(来自您的输入列表的实际列表)。或者使用 LINQ 查询语法:

    List<int> result = (from l in lists
                        from e in l select e).ToList();
    

    我相信 C# 编译器实际上可能会对此进行优化,因此它不会遍历所有单个元素(并且与上面的显式版本执行相同的操作)。如果你有已知数量的列表,你当然可以写:

    List<int> result = (from l in new[] { list1, list2, list3, list4 }
                        from e in l select e).ToList();
    

    它不如专门为此目的定义您自己的方法那么优雅,但它显示了 LINQ 查询语法的强大功能。

    【讨论】:

      【解决方案5】:

      对于变量列表计数:

      IEnumerable<T> enumerable = Enumerable.Empty<T>();
      foreach (List<T> list in [whatever])
         enumerable = enumerable.Concat(list);
      

      如果你想要一个依赖列表,最后你可以添加一个“ToList()”:

      List<T> list = enumerable.ToList();
      

      但是,这可能不是必需的。

      【讨论】:

        【解决方案6】:

        您当然可以这样做,尽管它可能效率不高。

        正如其他答案所述,不要忘记将.ToList() 添加到代码行的末尾,或使用List1.AddRange(List2); List1.AddRange(List3); ... 以提高效率。

        【讨论】:

          【解决方案7】:

          如果你想要做一个真正的联合,你可以在 LINQ 中使用联合...

          【讨论】:

            猜你喜欢
            • 2021-01-25
            • 1970-01-01
            • 2019-11-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-09
            • 2015-09-27
            相关资源
            最近更新 更多