在對集合進行迭代/預覽之前,是否有任何速度改進或實際上指向檢查Enumerable的Count()
?我是否需要在foreach前檢查Enumerable的Count()
List<int> numbers = new List<int>();
if(numbers.Count() > 0)
{
foreach(var i in numbers) {/*Do something*/}
}
在對集合進行迭代/預覽之前,是否有任何速度改進或實際上指向檢查Enumerable的Count()
?我是否需要在foreach前檢查Enumerable的Count()
List<int> numbers = new List<int>();
if(numbers.Count() > 0)
{
foreach(var i in numbers) {/*Do something*/}
}
不,反之亦然。如果它不是一個集合(如List
或Array
),而是延遲執行的查詢,它必須完全執行,這可能非常昂貴,只是爲了確定計數。在你的例子中,它實際上是一個List
,Enumerable.Count
已經足夠聰明瞭,可以先嚐試將它轉換爲ICollection<T>
/ICollection
。如果成功使用Count
屬性。
所以只需使用foreach
。如果序列是空的,它不會受到傷害,循環將立即退出。
出於同樣的原因,如果您只想檢查一個序列是否至少包含一個元素,則最好使用Enumerable.Any
而不是Count() > 0
。意圖也更清楚。
我不相信有任何速度的提高或迭代/ foreaching在採集前檢查可枚舉的Count()
確實點。因爲無論如何,如果集合中沒有任何項目,則在該foreach塊中不執行任何代碼。
我同意。 'foreach'是安全的,因爲如果枚舉是空的,它只需要迭代0次,所以事先不需要檢查(除非枚舉可以是'NULL'當然!) – oerkelens
即使你要檢查的次數,使用次數,而不是擴展方法Count(),因爲計數的性能()更糟糕的是再算上
@TimSchmelter所以這個答案是不正確的? – Coops
雖然性能損失可能不是那麼多,但它是糟糕的設計,它可能意味着對該對象的某種反思,並且CLR也必須爲它而上,所以它總是會影響性能。 –
@CodeBlend:哎呦,我已經刪除了我的評論,然後再發布你的評論。這並不正確,因爲'Count'比'Count()'更有效,但是在集合的情況下,即使使用了'Enumerable.Count',也可以使用Count屬性。但是由於必須調用另一個方法將其轉換爲'Collection',直接使用'Count'會更有效,但這實際上是微優化。我更喜歡'Enumerable.Count',因爲它允許改變類型(例如改爲數組或'IEnumerable
簡短的回答:不,恰恰相反。
較長的回答:foreach
關鍵字調用IEnumerator
接口上的方法。這些方法隱含地檢查存在的項目。所以調用Count()
純粹是多餘的。
如果您的Enumarable是懶惰評估(LINQ),調用Count()
實際上是非常糟糕的,因爲它會評估整個Enumerable。
由於如果Enumarable爲空,則不執行foreach,因此最好不要使用Count
。
因此,儘管這是一個側記你的答案對於任何讀者來說都是完整的,唯一你必須做的檢查就是檢查'null'是否有可能收集。顯然在我的例子中不可能。 – Coops
@CodeBlend:應該首先完成'null'檢查,如果它是方法中的一個參數,則應該用一個有意義的消息來拋出'ArgumentNullException'。 –