列出“X”列表的串联
我有例如5列出所有相同的类型。 我能做到吗?
List newset = List1.Concat(List2).Concat(List3).Concat(List4).....
你可以,但不要忘记追加.ToList();
到底。 你也可以调用newset.AddRange(ListX);
我认为它在性能方面更好
你可以这样做(尽管你最后需要.ToList()
)。
但是,生成单个列表(稍微)更有效,并使用AddRange添加每个列表。 只需使用所有列表的总大小初始化列表,然后重复调用AddRange。
您可能需要考虑执行以下操作:
public List ConcatMultiple (this List list, params[] ICollection others) { List results = new List (list.Count + others.Sum(i => i.Count)); results.AddRange(list); foreach(var l in others) results.AddRange(l); return results; }
然后拨打电话:
List newset = List1.ConcatMultiple(List2, List3, List4);
是的,你可以这样做。
List newSet = List1.Concat(List2).Concat(List3).Concat(List4).ToList();
如果要连接任意(以前未知)数量的列表,则可能需要连接一组列表。 可能最简单的方法是使用SelectMany
运算符(或嵌套在LINQ查询中的子句):
IEnumerable> lists = /* get list of lists */; List result = lists.SelectMany(e => e).ToList();
SelectMany
运算符为输入列表的每个元素(列表)调用给定函数,然后连接所有结果列表(列表输入列表中的实际列表)。 或者使用LINQ查询语法:
List result = (from l in lists from e in l select e).ToList();
我相信C#编译器实际上可能会对此进行优化,因此它不会迭代所有单个元素(并且与上面的显式版本完全相同)。 如果您有已知数量的列表,您当然可以写:
List result = (from l in new[] { list1, list2, list3, list4 } from e in l select e).ToList();
它并不像为此目的完全定义自己的方法那样优雅,但它显示了LINQ查询语法的强大function。
你当然可以做到这一点,虽然效率可能不高。
如其他答案所述,不要忘记将.ToList()
添加到代码行的末尾,或者使用List1.AddRange(List2); List1.AddRange(List3); ...
List1.AddRange(List2); List1.AddRange(List3); ...
List1.AddRange(List2); List1.AddRange(List3); ...
为了提高效率。
对于变量列表计数:
IEnumerable enumerable = Enumerable.Empty (); foreach (List list in [whatever]) enumerable = enumerable.Concat(list);
最后,如果你想要一个依赖List,你可以添加一个“ToList()”:
List list = enumerable.ToList();
但是,这可能不需要。
你可以在LINQ中使用一个联盟,如果它是你想要做的真正的联盟……