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
循环作为语言的一部分时。 这并不像你自然有一个委托应用于每个名称,例如作为方法参数 – 你总是只是写到控制台。 有关更多想法,请参阅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); }