Skip to main content
 首页 » 编程设计

c#之使用linq将对象集合的列表成员的内容组合成单个列表

2024年02月02日25mq0036

是否可以用 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>> .

请您参考如下方法:

您可以在 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();