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

时间:2013-12-10 17:10:25

标签: c# linq

我有这两个条款:

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;

7 个答案:

答案 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);
}