【发布时间】:2010-03-01 17:32:51
【问题描述】:
例如,我有 5 个列出所有相同类型的列表。我可以简单地做吗
List<T> newset = List1.Concat(List2).Concat(List3).Concat(List4).....
【问题讨论】:
例如,我有 5 个列出所有相同类型的列表。我可以简单地做吗
List<T> newset = List1.Concat(List2).Concat(List3).Concat(List4).....
【问题讨论】:
您可以这样做(尽管最后需要.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);
【讨论】:
是的,你可以这样做。
List<Thing> newSet = List1.Concat(List2).Concat(List3).Concat(List4).ToList();
【讨论】:
你可以,但不要忘记在最后附加.ToList();。
你也可以打电话给newset.AddRange(ListX); 我认为它在性能方面更好
【讨论】:
AddRange 在您已经使用 Lists 时会更好,但如果您使用 IEnumerable 和 LINQ Concat 那么在 ToList() 之前什么都做不了,所以它可能是更高效。
如果您想连接任意(以前未知)数量的列表,那么您可能需要连接一组列表。可能最简单的方法是使用 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 查询语法的强大功能。
【讨论】:
对于变量列表计数:
IEnumerable<T> enumerable = Enumerable.Empty<T>();
foreach (List<T> list in [whatever])
enumerable = enumerable.Concat(list);
如果你想要一个依赖列表,最后你可以添加一个“ToList()”:
List<T> list = enumerable.ToList();
但是,这可能不是必需的。
【讨论】:
您当然可以这样做,尽管它可能效率不高。
正如其他答案所述,不要忘记将.ToList() 添加到代码行的末尾,或使用List1.AddRange(List2); List1.AddRange(List3); ... 以提高效率。
【讨论】:
如果你想要做一个真正的联合,你可以在 LINQ 中使用联合...
【讨论】: