2011-05-03 50 views
0

假設我想訪問Collection中的對象,並且我想確保 它不會遍歷整個Collection來確定大小。確定是否調用ICollection Count會導致迭代

如何確定並控制對'Count'的調用是否會導致實際迭代集合? (除了使用我自己的ICollection實現之外),換句話說是否提供了這種實現?

public void PrintThreeNames(ICollection<string> names) 
{ 
    //first I want to know if the collection has at least three elements. 
    if (names != null && names.Count >= 3) 
    { 
     IEnumerator<string> enumerator = names.GetEnumerator(); 
     string value0 = enumerator.Current; 
     enumerator.MoveNext(); 
     string value1 = enumerator.Current; 
     enumerator.MoveNext(); 
     string value2 = enumerator.Current; 
     //print values. 
     Console.Writeline(value0 + value1 + value2); 
    } 
} 

迴應程序員的英雄問題。我想我可以讓一個IENumerable集合添加一百萬個文檔,並計算它以查看調用Count的速度。我問了這個問題,因爲我可能選擇使用IEnumerable而不是Collection,因爲我的Collections的數量和數據量都很大,以至於一次返回所有這些將會是一個問題。不過,我想知道IEnumarable的缺點,Joshua在另一個問題中指出,鎖定它不是一個好主意。

+0

我已經檢查了衆所周知的列表類作爲一個經常使用的實現。 Count方法的文檔是:獲取列表中實際包含的元素的數量。仍然不知道它是否在這裏迭代或不... ...(我可以猜到Allthough) – HCP 2011-05-03 13:30:45

回答

1

因爲ICollection將Count作爲一個屬性公開,所以應該很安全地假定它的價值非常便宜(即它不應該遍歷整個集合)。

這只是一個圍繞屬性的最佳實踐 - 獲取他們的價值應該是便宜 - 期間。

如果操作昂貴,那麼它應該是一種方法 - 例如,計數()。

當然,有人可以提供一個昂貴的ICollection.Count實施 - 然而,那個人沒有做正確的事情。

如果計算元素數量很貴,它們應該只實現IEnumerable - 而不是ICollection。

1

從技術上講,因爲ICollection是一個接口,您不能保證它不會遍歷集合。無論如何可以實現界面。

1

是否有相對昂貴的Count的實現?可能吧,但他們很少見; .NET框架類被調整爲相當好的全面效率。

重要嗎?幾乎肯定不是。除非你查詢Count數百萬次超過數百萬元素的集合,差別是如此之小是不相關的:

  • 100萬個電話給List<T>.Count含有1個百萬個整數:0.85s
  • 100萬個電話到HashSet<T>.Count()包含100萬整數:1.45s
相關問題