我有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有一种单行方式吗?
答案 0 :(得分:9)
假设允许人们拥有一个以上的孩子...... [在此插入政治声明......]
people.Where(p => p.Kids.Any(k => k.age < 5))
答案 1 :(得分:5)
您可以使用Enumerable.Where
和Any
扩展程序:
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)
var peopleWithLittleKids = people.Where(p => p.Kids.Any(k => k.age < 5).ToList();