如何从多个List<>?中获取所有元素

时间:2011-09-19 15:57:40

标签: c# linq c#-3.0 linq-to-objects

在C#中,我有以下类型:

List<List<mytype>> MyLists;
List<mytype> MainList;

我想把所有List中的每个元素&lt;&gt;在MyList中,将它们放在MainList中。然后,MainList将仅具有由每个List&lt;&gt;内的所有元素组成的元素。 MyList的。我尝试了以下但是得到了一个关于无法推断出类型的错误:

MyLists.ForEach(list => MainList.AddRange(list.SelectMany(x => x != null)));

我不确定在SelectMany()中放入什么,因为我想要列表中的所有元素&lt;&gt;。这些要素不需要符合任何标准。

有关如何做到的任何建议吗?

3 个答案:

答案 0 :(得分:4)

MainList.AddRange(from list in MyLists
                  from element in list
                  select element);

或者,如果您愿意,

MainList.AddRange(MyLists.SelectMany(list => list));

答案 1 :(得分:3)

这只需要一次SelectMany电话:

MainList = MyLists.SelectMany(l => l).ToList();

请注意,这不需要在此调用之前构造/初始化MainList,因为它已从ToList()调用完全初始化。


编辑:

由于您确实包含null项检查,因此如果您需要从列表中删除null元素,则还可以添加该检查:

MainList = MyLists.SelectMany(l => l.Where(i => i != null)).ToList();

和/或过滤整个null列表:

MainList = MyLists
             .Where(l => l != null)
             .SelectMany(l => l.Where(i => i != null))
             .ToList();

此外,如果您想添加项目到MainList,而不是让原始列表中的MainList“只有元素”,则可以使用{{ 1}}仍然:

AddRange

答案 2 :(得分:0)

另一种选择,更接近原始尝试:MyLists.ForEach(list => MainList.AddRange(list));

换句话说,如果您使用ForEach和AddRange,则不需要SelectMany甚至Select。