2012-01-01 64 views
5

感謝您向我解釋有關IList和IEnumerable的幫助。我已將question標記爲已回答。現在我要求提供更多信息。IList的計數方法或屬性

我有這樣的代碼:

for (var index = 0; index < Model.Items.Count(); index++) 

它是在以前的文章中提出,它不是有效,因爲伯爵()是一種方法,它被執行多次。我試過以下內容:

for (var index = 0; index < Model.Items.Count; index++) 

這似乎工作。

有人可以確認是否有區別。兩者都工作,所以我不是100%確定。

以下是最有效的嗎? foreach是否需要IList或IEnumerable?

foreach(var item in Items) 
+0

請把鏈接發給您剛纔的問題 – 2012-01-01 11:45:31

+0

加入prervious問題 – rene 2012-01-01 11:48:53

回答

4

Count()方法調用實際上調用靜態Enumerable.Count()方法。這是針對IList實現進行了優化以使用該屬性 - 但這需要動態類型檢查,並且仍然會通過該屬性 - 因此使用該屬性肯定會更有效。在.NET 3.5中,它只優化了ICollection<T>,而在.NET 4中它優化了非通用的ICollection。有關更多詳細信息,請參閱my Edulinq blog post on Count

至於你的問題的最後一點:一個foreach循環可能會或可能不會是更有效,但它會更可讀在我看來,這是相當更重要。除非你確實需要每個條目的索引,否則我肯定會使用foreach

+0

感謝喬恩。這些foreach是否需要IList或IEnumerable? – 2012-01-01 11:54:22

+0

@ Samantha2:嚴格來說,它實際上並不需要,但是'IEnumerable'(或'IEnumerable ')足以保證你可以使用'foreach'。 – 2012-01-01 11:55:25

6

Count()擴展方法適用於支持IEnumerable所有對象,因爲IEnumerable本身不具備申報項目數的任何手段,它可能有使用它的IEnumerator,它可以是一個真正的性能命中了IEnumerable實例迭代如果多次調用。

但是,如果你看看Count()實現,你會看到它是針對ICollection類型的優化(通用和非通用的,至少在FW4.0,這意味着IListIList<T>也優化),如果您的對象執行ICollection(其中報告Count屬性中的項目計數),Count()方法返回項目計數而無需迭代收集。這就是爲什麼你沒有看到性能差異。儘管如此,如果你知道你有ICollectionIList實例,爲什麼不直接獲得Count屬性並獨立於Count()方法實現?

此外,請記住,你可以在一個變量緩存Count()方法的返回值來抑制多個呼叫:

var count = Model.Items.Count(); 
for(var index = 0; index < count; index++) { }