1

我有一个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 的方式来做到这一点?

4

3 回答 3

9

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

people.Where(p => p.Kids.Any(k => k.age < 5))
于 2013-01-21T22:44:24.350 回答
5

您可以使用Enumerable.WhereAny扩展方法:

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

请注意,ToList()如果您只是要遍历结果(通过foreach),您也可以停止,因为结果不需要 a List<T>

另外 - 如果他们有多个匹配的孩子,你的循环方法将Person多次添加到列表中。如果你想复制这个功能,你可以通过:

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

(这可能不是您想要的,并且原始代码中存在错误,但这确实与原始代码匹配......)

于 2013-01-21T22:44:00.903 回答
2

单独的 Lambda 无法解决您的问题。LINQ 是一种可以帮助您做您想做的事情的技术:

var peopleWithLittleKids = people.Where(p => p.Kids.Any(k => k.age < 5).ToList();
于 2013-01-21T22:43:59.427 回答