使用linq将对象集合的列表成员的内容合并到单个列表中

时间:2011-12-16 20:31:28

标签: c# linq

是否可以用linq替换下面的foreach循环?

public class Foo
{
    List<Bar> Bars {get; set;}
}

List<Foo> fooList = GetFooList();
List<Bar> allBars = new List<Bar>();

foreach (Foo foo in fooList)
{
    allBars.AddRange(foo.Bars);
}

我最接近的是:

var temp = fooList.Select(foo => foo.Bars).ToList();

给出List<List<Bar>>

4 个答案:

答案 0 :(得分:2)

您可以在foo.Bars上使用SelectMany()

allBars.AddRange(fooList.SelectMany(foo => foo.Bars));

如果allBars变量在AddRange()之前不包含任何内容,则可以跳过对象创建:

List<Bar> allBars = fooList.SelectMany(foo => foo.Bars).ToList();

如果你不打算在其他地方使用fooList,你可以写:

List<Bar> allBars = GetFooList().SelectMany(foo => foo.Bars).ToList();

答案 1 :(得分:1)

Linq的SelectMany是你的朋友。

http://msdn.microsoft.com/en-us/library/bb534336.aspx

fooList.SelectMany(f => f.Bars)

答案 2 :(得分:1)

另一种变化:

List<Foo> fooList = GetFooList();
List<Bar> allBars = fooList.SelectMany(x => x.Bars).ToList();

答案 3 :(得分:1)

这是另外一个

   List<Bar> allBars = fooList.SelectMany(foo => foo.Bars).ToList();