列出“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中使用一个联盟,如果它是你想要做的真正的联盟……