列出<T>"X"列表的串联

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)


Dav*_*ton 5

是的,你可以这样做.

List<Thing> newSet = List1.Concat(List2).Concat(List3).Concat(List4).ToList();
Run Code Online (Sandbox Code Playgroud)


Tom*_*cek 5

如果您想连接任意(以前未知)数量的列表,那么您可能需要连接列表的集合。最简单的方法可能是使用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 查询语法的强大功能。


And*_*rey 4

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