2014-01-08 34 views

回答

17

不,反之亦然。如果它不是一個集合(如ListArray),而是延遲執行的查詢,它必須完全執行,這可能非常昂貴,只是爲了確定計數。在你的例子中,它實際上是一個List,Enumerable.Count已經足夠聰明瞭,可以先嚐試將它轉換爲ICollection<T>/ICollection。如果成功使用Count屬性。

所以只需使用foreach。如果序列是空的,它不會受到傷害,循環將立即退出。

出於同樣的原因,如果您只想檢查一個序列是否至少包含一個元素,則最好使用Enumerable.Any而不是Count() > 0。意圖也更清楚。

+0

因此,儘管這是一個側記你的答案對於任何讀者來說都是完整的,唯一你必須做的檢查就是檢查'null'是否有可能收集。顯然在我的例子中不可能。 – Coops

+1

@CodeBlend:應該首先完成'null'檢查,如果它是方法中的一個參數,則應該用一個有意義的消息來拋出'ArgumentNullException'。 –

1

我不相信有任何速度的提高或迭代/ foreaching在採集前檢查可枚舉的Count()確實點。因爲無論如何,如果集合中沒有任何項目,則在該foreach塊中不執行任何代碼。

+0

我同意。 'foreach'是安全的,因爲如果枚舉是空的,它只需要迭代0次,所以事先不需要檢查(除非枚舉可以是'NULL'當然!) – oerkelens

0

即使你要檢查的次數,使用次數,而不是擴展方法Count(),因爲計數的性能()更糟糕的是再算上

+0

@TimSchmelter所以這個答案是不正確的? – Coops

+1

雖然性能損失可能不是那麼多,但它是糟糕的設計,它可能意味着對該對象的某種反思,並且CLR也必須爲它而上,所以它總是會影響性能。 –

+0

@CodeBlend:哎呦,我已經刪除了我的評論,然後再發布你的評論。這並不正確,因爲'Count'比'Count()'更有效,但是在集合的情況下,即使使用了'Enumerable.Count',也可以使用Count屬性。但是由於必須調用另一個方法將其轉換爲'Collection',直接使用'Count'會更有效,但這實際上是微優化。我更喜歡'Enumerable.Count',因爲它允許改變類型(例如改爲數組或'IEnumerable ')。有時候最好「隱藏」實際類型並聲明基類型f.e.以防止突變。 –

1

簡短的回答:不,恰恰相反。
較長的回答:foreach關鍵字調用IEnumerator接口上的方法。這些方法隱含地檢查存在的項目。所以調用Count()純粹是多餘的。

2

如果您的Enumarable是懶惰評估(LINQ),調用Count()實際上是非常糟糕的,因爲它會評估整個Enumerable。

由於如果Enumarable爲空,則不執行foreach,因此最好不要使用Count

相關問題