Jon*_*Jon 6 c# linq generics c#-3.0
我有例如5列出所有相同的类型.我能做到吗?
List<T> newset = List1.Concat(List2).Concat(List3).Concat(List4).....
Run Code Online (Sandbox Code Playgroud)
Ree*_*sey 13
你可以做到这一点(虽然你最后需要.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;
}
Run Code Online (Sandbox Code Playgroud)
然后致电:
List<MyClass> newset = List1.ConcatMultiple(List2, List3, List4);
Run Code Online (Sandbox Code Playgroud)
是的,你可以这样做.
List<Thing> newSet = List1.Concat(List2).Concat(List3).Concat(List4).ToList();
Run Code Online (Sandbox Code Playgroud)
如果您想连接任意(以前未知)数量的列表,那么您可能需要连接列表的集合。最简单的方法可能是使用SelectMany运算符(或fromLINQ 查询中的嵌套子句):
IEnumerable<List<int>> lists = /* get list of lists */;
List<int> result = lists.SelectMany(e => e).ToList();
Run Code Online (Sandbox Code Playgroud)
该SelectMany运算符为输入列表(这是一个列表)的每个元素调用给定函数,然后连接所有结果列表(列表输入列表中的实际列表)。或者使用 LINQ 查询语法:
List<int> result = (from l in lists
from e in l select e).ToList();
Run Code Online (Sandbox Code Playgroud)
我相信 C# 编译器实际上可能对此进行优化,以便它不会迭代所有单个元素(并且执行与上面的显式版本相同的操作)。如果你有已知数量的列表,你当然可以写:
List<int> result = (from l in new[] { list1, list2, list3, list4 }
from e in l select e).ToList();
Run Code Online (Sandbox Code Playgroud)
它不像专门为此目的定义自己的方法那么优雅,但它显示了 LINQ 查询语法的强大功能。