LINQ表达式而不是嵌套的foreach循环

我有这两个分支:

public class Client{ public List
addressList{get;set;} } public class Address{ public string name { get; set; } }

我有一个名为testList Client类型列表。 它包含n个客户端,每个客户端包含n个地址

 List testList; 

如何使用LINQ执行以下操作:

 foreach (var element in testList) { foreach (var add in element.addressList) { console.writeLine(add.name); } } 

好吧,我不会将Console.WriteLine放在lambda表达式中,但您可以使用SelectMany来避免嵌套:

 foreach (var add in testList.SelectMany(x => x.addressList)) { Console.WriteLine(add.name); } 

我认为没有理由将结果转换为列表,然后使用List.ForEach当有一个非常好的foreach循环作为语言的一部分时。 这并不像你自然一个委托应用于每个名称,例如作为方法参数 – 你总是只是写到控制台。 有关更多想法,请参阅Eric Lippert关于该主题的博客文章 。

(我还强烈建议您开始遵循.NET命名约定,但这是另一回事。)

 foreach(var a in testList.SelectMany(c => c.addressList)) { Console.WriteLine(a.name); } 

它不会实现任何新的集合。

这可能有所帮助:

 testList.ForEach(i => i.addressList.ForEach(j => Console.WriteLine(j.name))); 
 foreach(var add in testList.SelectMany(element => element.addressList)){ Console.WriteLine(add.name); } 
 testList.SelectMany(c => c.addressList) .Select(a => a.name) .ToList() .ForEach(Console.WriteLine) 

使用ForEach方法:

 testList.ForEach(tl=>tl.addressList.ForEach(al=>console.writeLine(al.name))); 

LINQ不包含ForEach函数, 并且它们不打算这样做 ,因为它违背了LINQ作为函数方法的想法。 所以你不能在一个声明中这样做。 List有一个ForEach方法,但我建议不要使用它,原因与它不在LINQ中的原因相同。

但是,您可以使用LINQ来简化代码,例如

 foreach (var add in testList.SelectMany(x => x.addressList)) { Console.WriteLine(add.name); } // or foreach (var name in testList.SelectMany(x => x.addressList).Select(x => x.name)) { Console.WriteLine(name); }