2008-10-15 73 views
3

對不起,該標題只是傷害。我不知道是否有坍塌下面的代碼段爲單線一個LINQ到集合擴展方法:是否有一種linq-y方式來對聯合對象集合的屬性進行收集?

public IEnumerable<Child> GetAllChildren(IEnumerable<Parent> parents){ 

    var result = new List<Child>(); 

    foreach(Parent parent in parents) 
    foreach(Child child in parent.Children) 
     result.Add(child); 

    return result; 
} 

如果可以摺疊到這一條語句,嘗試在瘋狂難度:

public IEnumerable<Child> GetAllChildren(IEnumerable<Grandparent> nanas){ 

    var result = new List<Child>(); 

    foreach(Grandparent papa in nanas) 
    foreach(Parent parent in papa.Children) 
     foreach(Child child in parent.Children) 
     result.Add(child); 

    return result; 
} 

回答

7

這裏是強制性的方法形式。

return parents 
    .SelectMany(p => p.Children); 

併爲兩個層次:

return oldies 
    .SelectMany(grand => grand.Children) 
    .SelectMany(parent => parent.Children); 
9

這將工作:

public IEnumerable<Child> GetAllChildren(IEnumerable<Parent> parents) 
{ 
    return from parent in parents 
      from child in parent.Children 
      select child; 
} 

,然後這樣的:

public IEnumerable<Child> GetAllChildren(IEnumerable<Grandparent> nanas) 
{ 
    return from papa in nanas 
      from parent in papa.Children 
      from child in parent.Children 
      select child; 
} 

請注意,在這個例子中,我並沒有實際返回一個列表,我返回一個IEnumerable數據源,直到您開始對它進行foreach或類似的操作,實際上不會進行任何處理。

如果需要返回一個列表,修改每個return語句如下:

return (from ..... 
      ... 
      select child).ToList(); 
+0

返回值必須是一個IEnumerable,並做了最簡單的方法(至少據我所知)是返回實現IEnumerable集合。感謝你的回答! – Will 2008-10-15 15:45:40

+0

您可以返回一個集合,或者使用yield return,如果您不熟悉msdn,可以在msdn上查找yield關鍵字。 – 2008-10-15 15:46:26

相關問題