我有这两个条款:
public class Client{
public List<Address> addressList{get;set;}
}
public class Address{
public string name { get; set; }
}
我有一个名为Client
的{{1}}类型的列表。它包含n个客户端,每个客户端包含n个地址
testList
如何使用LINQ执行以下操作:
List<Client> testList;
答案 0 :(得分:6)
我不会将Console.WriteLine
放在lambda表达式中,但您可以使用SelectMany
来避免嵌套:
foreach (var add in testList.SelectMany(x => x.addressList))
{
Console.WriteLine(add.name);
}
我认为没有理由将结果转换为列表,然后使用List<T>.ForEach
作为语言的一部分时有一个非常好的foreach
循环。这并不像你自然拥有代表来申请每个名字,例如作为方法参数 - 您总是只是写入控制台。有关更多想法,请参阅Eric Lippert's blog post on the topic。
(我还强烈建议您开始遵循.NET命名约定,但这是另一回事。)
答案 1 :(得分:2)
foreach(var a in testList.SelectMany(c => c.addressList))
{
Console.WriteLine(a.name);
}
它不会实现任何新系列。
答案 2 :(得分:2)
这可能会有所帮助:
testList.ForEach(i => i.addressList.ForEach(j => Console.WriteLine(j.name)));
答案 3 :(得分:2)
foreach(var add in testList.SelectMany(element => element.addressList)){
Console.WriteLine(add.name);
}
答案 4 :(得分:1)
testList.SelectMany(c => c.addressList)
.Select(a => a.name)
.ToList()
.ForEach(Console.WriteLine)
答案 5 :(得分:1)
使用ForEach方法:
testList.ForEach(tl=>tl.addressList.ForEach(al=>console.writeLine(al.name)));
答案 6 :(得分:1)
LINQ不包含ForEach
函数and they don't intend to,因为它违背了LINQ为functional方法的想法。所以你不能在一个声明中这样做。 List<T>
有一个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);
}