2013-01-21 134 views
1

我有一個List<Person>(人)每個人都有一個List<Kid>(兒童)這可以用更少的代碼使用lambda來完成嗎?

如果我想找到所有的孩子不到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

夥計們,我沒有給你們任何一個人反對票,有人對所有答案投了反對票。 – developer747

+1

*「每個人都有一個'List '(kids)」*與您給出的示例代碼相矛盾,其中'p.Kid'是單個對象。請澄清,因爲這種含糊不清的問題是在答案上產生一羣降薪票。 – cdhowie

+0

請注意,您的循環方法可以得到改進,因爲當發現一個孩子時它不會'破壞'內部的'foreach'(類似於支出者的'Any')。 –

回答

9

假設人們可以有超過一個孩子... [在這裏插入政治聲明...]

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

蘭巴達斯獨自解決您的問題。 LINQ是技術,這將有助於你做你想要什麼:

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

downvote的任何理由?根據OP,p.Kid是單個實例而不是集合。 –

+0

根據OP,它是不明確的。 (*「每個人都有一個'列表'(孩子)」*與示例代碼相矛盾。)我不是那個低調的人,但這可能是他們這樣做的理由。 – cdhowie

+0

@cdhowie - 猜猜我應該閱讀文本以及代碼。固定。 –

5

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

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

請注意,您也可以留下過ToList()如果你只是打算遍歷結果(通過foreach),因爲結果不需要List<T>

此外 - 如果您的循環方法有多個匹配的子項,則會多次將Person添加到列表中。如果你想複製此功能,您可以通過:

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

(這不是你想要的是有可能的,原始的錯誤,但這並符合原代碼...)

+0

+1,用於嘗試創建問題中原始代碼的linq對應部分。 –

相關問題