2012-03-03 33 views
9

enter image description hereIEnumerable可能的多次枚舉?

這是爲什麼?我該如何解決它?

+1

除了最終的截圖和文本以外,所有內容都只是分散了真正的問題。 – usr 2012-03-03 20:19:26

+1

這與http://stackoverflow.com/q/7244178/219583非常相似。任何()將作爲第二個枚舉和Aggregate()。 – 2012-03-03 20:20:43

+9

請勿將代碼張貼爲截圖 - 將源代碼粘貼到問題中。 – Joe 2012-03-03 20:25:37

回答

14

這裏沒有什麼可以解決的。 Any()將迭代枚舉,但在第一個元素之後停止(之後它返回true)。

多枚舉主要是在兩種情況下一個問題:

  • 性能:一般來說,你想避免多次重複,如果你 可以,因爲它是慢。這不適用於此,因爲Any()將 只是確認至少有一個元素,並且是您需要的檢查。此外,您並未訪問任何遠程/外部資源,只是內存順序。

  • 不能迭代多次的枚舉:例如, 從網絡等接收項目 - 也不適用於此。

作爲非LINQ的版本,只需要遍歷一旦你可以做到以下幾點:

bool foundAny= false; 
bool isEqual = true; 

if(f == null) 
    throw new ArgumentException(); 

foreach(var check in f) 
{ 
    foundAny = true; 
    isEqual = isEqual && check(p,p2); 
} 

if(!foundAny) 
    throw new ArgumentException(); 

return isEqual; 

但是,如前所述,在你的情況下,它不會有所作爲,而我將與更易讀的版本一起使用。

+1

如果這是一個數據庫查詢它會執行兩次,通常完全。 – usr 2012-03-03 20:27:19

+1

@usr:同意,我補充說,對於第一種情況 - 無論是遠程/外部資源還是內存中順序 – BrokenGlass 2012-03-03 20:30:18

5

如果Any方法沒有其他方法來確定結果,則可以導致IEnumerable<T>的枚舉。在某些情況下,它可能是一個問題,例如,如果IEnumerable<T>實例實際上是一個IQueryable<T>,將導致執行數據庫查詢或Web服務調用。現在,如果它只是一個內存中的集合,這不是一個真正的問題,因爲枚舉集合不會有明顯的副作用。無論如何,Any將使用Count屬性,如果序列執行ICollection<T>,所以它不會導致枚舉。