2015-07-19 78 views
1

我編碼一個C#窗體應用程序,並想知道如果以下兩個功能實現同樣的結果:IEnumerable <T>函數的收益率比List <T>函數的效率更高嗎?

public List<object> Method1(int parentId) 
{ 
    List<object> allChildren = new List<object>(); 
    foreach (var item in list.Where(c => c.parentHtmlNodeForeignKey == parentId)) 
    { 
     allChildren.Add(item); 
     allChildren.AddRange(Method1(item.id)); 
    } 
    return allChildren; 
} 
public IEnumerable<object> Method2(int parentId) 
{ 
    foreach (var item in list.Where(c => c.parentHtmlNodeForeignKey == parentId)) 
    { 
     yield return item; 
     foreach (var itemy in Method2(item.id)) 
     { 
      yield return itemy; 
     } 
    } 
} 

我是在說,Method1功能比Method2更有效的糾正?

此外,上述任何一種功能都可以編碼爲更高效?

編輯

我使用的函數返回某些對象,然後在ListView顯示。然後我循環這些相同的對象來檢查是否有字符串出現。

謝謝。

+0

難以閱讀所有這些長名。 'Method1','Method2'有什麼問題? –

+2

他們如何被使用?你是否多次迭代resluts?你是否遍歷所有結果? –

+0

這取決於你如何使用該功能。 Yield函數按需執行,因此對函數的單個調用所需的運行時間少於List函數(但不會得到結果)。 Yield函數需要構建迭代器對象的開銷。所以如果你對Yield方法的結果調用'ToList()',這可能比純粹的'List'函數慢。 –

回答

3

這很大程度上取決於你想要做什麼。例如,如果使用FirstOrDefault(p => ....),yield方法可以更快,因爲不需要將所有內容存儲到列表中,並且如果第一個元素是正確的,那麼list方法會有一些開銷(當然,yield方法也有開銷,但是作爲我說這取決於)。

如果你想一次又一次地遍歷數據,那麼你應該去列表。

+1

更不用說容量每次調整大小時到達邊界 –

1

這取決於很多東西。

這裏有一些理由使用IEnumerable<T>超過List<T>

  1. 當你迭代集合的部分(例如使用FirstOrDefaultAnyTake等)。
  2. 當你有一個集合,你可以ToList()它(如斐波那契系列)。

當你不應該使用IEnumerable<T>超過List<T>

  1. 當你與不同的條件列舉一個DB查詢多個倍(您可以在內存中的結果)。
  2. 當您想多次迭代整個集合時 - 無需每次都創建迭代器。