如何将具有相同项目类型的列表列表合并到单个项目列表中?


209

这个问题令人困惑,但是如以下代码中所述,它更加清晰:

   List<List<T>> listOfList;
   // add three lists of List<T> to listOfList, for example
   /* listOfList = new {
        { 1, 2, 3}, // list 1 of 1, 3, and 3
        { 4, 5, 6}, // list 2
        { 7, 8, 9}  // list 3
        };
   */
   List<T> list = null;
   // how to merger all the items in listOfList to list?
   // { 1, 2, 3, 4, 5, 6, 7, 8, 9 } // one list
   // list = ???

不确定是否可以使用C#LINQ或Lambda?

本质上,如何连接或“ 拉平 ”列表列表?

Answers:


455

使用SelectMany扩展方法

list = listOfList.SelectMany(x => x).ToList();

73
我想知道有多少人写了自己的“ Flatten”扩展名而没有意识到SelectMany的工作原理?
James Schek

1
为什么需要x => x才能起作用?我通常会看到类似x => x +1的东西,但看不到x => x的东西。
SwimBikeRun 2015年

9
@SwimBikeRun SelectMany用于获取IEnumerable的TSources,将列表中的每个TSource转换为IEnumerable的TResults,然后将所有这些IEnumerables连接成一个大的。在这种情况下,您有一个要启动的列表列表,因此,如果要将它们串联起来,则标识函数(x => x)从TSource(它是TResults的IEnumerable)映射到TResults IEnumerable的函数。这实际上只是一个特例,您不需要将每个TSource转换为列表的额外步骤,因为它已经是一个列表。
肖恩

@JaredPar我们可以将此逻辑应用于list <list <list <T >>>吗?
Tk1993年

4
@TusharKukreti当然,只需使用list.SelectMany(x => x.SelectMany(y => y)).ToList();
Brandon Kramer

13

这是C#集成语法版本:

var items =
    from list in listOfList
    from item in list
    select item;

有点混乱,但很好。这个怎么样 var个项=从项中(从listOflist中的列表中选择列表)中选择项
David.Chu.ca,2009年

4
“ double from”与SelectMany相同。SelectMany可能是最强大的LINQ方法(或查询运算符)。要了解原因,请使用Google“ LINQ SelectMany Monad”,您会发现比想知道的更多的东西。
理查德·安东尼·海因

3
谷歌搜索“ LINQ SelectMany Monad”时不要包含引号,否则只会将您引回到此处。
Oxin

12

你是这个意思吗

var listOfList = new List<List<int>>() {
    new List<int>() { 1, 2 },
    new List<int>() { 3, 4 },
    new List<int>() { 5, 6 }
};
var list = new List<int> { 9, 9, 9 };
var result = list.Concat(listOfList.SelectMany(x => x));

foreach (var x in result) Console.WriteLine(x);

结果是: 9 9 9 1 2 3 4 5 6


或者,您可以使用list.AddRange()而不是Concat()将合并的项目添加到现有列表中。
dahlbyk

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.