2012-11-29 91 views
4

正如你從下面的代碼中可以看到的,我在列表中建立了一個列表中的對象集合。想知道是否有更好的方式來寫這個討厭的方法。如何從集合中的集合中更好地獲取集合?

乾杯提前

private List<ListINeed> GetListINeed(Guid clientId) 
     { 
     var listINeed = new List<objectType>(); 
      someobject.All(p => 
           { 
            p.subcollection.All(q => 
                 { 
                  listINeed.Add(q.subObject); 
                  return true; 
                 }); 
            return true; 
           }); 
      return listINeed; 
     } 

回答

5

使用SelectMany

private List<ListINeed> GetListINeed(Guid clientId) 
{ 
    return someobject.SelectMany(p=> p.subcollection) 
          .Select(p=>p.subObject).ToList(); 
} 
+1

歡呼,非常感謝!沒有想到使用SelectMany方法,並認爲所有的迴盪布朗有點傻! – BreakingBadCode

0

如何

return someobject.SelectMany(so=>so.subcollection).Select(o=>o.subObject).ToList(); 

這確實非常否定的功能的需求,除非你打算做別的事情在那裏(正如clientId參數暗示的那樣)。

+1

好的是,甚至可以這樣做。雖然如果我獲取對象的方式發生變化,那麼如果它在方法中,則不需要在其他地方重構。單點更改等 – BreakingBadCode

+0

我將返回IEnumerable <>而不是一個具體的列表,因此您可以將它留給該方法的使用者以決定是否要添加他們可以執行的其他條件。允許推遲執行。 –

+0

@BreakingBadCode,如果你必須從多個地方進行操作,我完全同意。 –

1

如果您有興趣使用查詢語法,那麼您可以正確使用它。

var query = from c in someObject 
      from o in c.subCollection 
      select o; 

這使得它一點點更好在某些情況下閱讀,例如

var query = from c in someObject 
      from o in c.subCollection 
      where c.SomeValue > 12 
      select o; 

個人喜好真的,我只是找到了查詢語法更易於閱讀。 :)

+0

我其實並沒有想到這一點。我傾向於使用超過查詢語法的Lamda表達式。這確實很好讀。特別是在那裏增加了where子句。 – BreakingBadCode