使用lambda可以用更少的代码完成吗?

时间:2013-01-21 22:42:56

标签: c# linq lambda

我有List<Person>(人)每个人都有List<Kid>(孩子)

如果我想找到所有5岁以下孩子的人,我会做这样的事情

var peopleWithLittleKids=new List<Person>()

foreach(var p in people)
{
    foreach(var kid in p.Kids)
    {
        if(kid.age<5)
        {
            peopleWithLittleKids.Add(p);
            break;
        }
    }
}

使用lambda有一种单行方式吗?

3 个答案:

答案 0 :(得分:9)

假设允许人们拥有一个以上的孩子...... [在此插入政治声明......]

people.Where(p => p.Kids.Any(k => k.age < 5))

答案 1 :(得分:5)

您可以使用Enumerable.WhereAny扩展程序:

var peopleWithLittleKids = people.Where(p => p.Kids.Any(k => k.age < 5)).ToList();

请注意,如果您只是想要遍历结果(通过ToList()),也可以不使用foreach,因为结果不需要List<T>。< / p>

此外 - 如果他们有多个匹配的子项,您的循环方法会多次向列表中添加Person。如果您想复制此功能,可以通过:

var peopleWithLittleKidsContainingDuplicates = people
               .SelectMany(p => p.Kids.Where(k => k.Age < 5).Select(k => p));

(这可能不是你想要的,也就是原版中的一个错误,但这确实与原始代码相符......)

答案 2 :(得分:2)

只有Lambda才能解决你的问题。 LINQ是一种可以帮助您实现所需目标的技术:

var peopleWithLittleKids = people.Where(p => p.Kids.Any(k => k.age < 5).ToList();