3 回答
TA貢獻2019條經驗 獲得超9個贊
IEnumerable不支持這一點。這是設計使然。IEnumerable使用惰性評估來獲取您需要的元素,然后再使用它們。
如果您想在不迭代的情況下知道項目的數量,可以使用ICollection<T>,它具有一個Count屬性。
TA貢獻1864條經驗 獲得超2個贊
的System.Linq.Enumerable.Count擴展方法IEnumerable<T>具有以下實現:
ICollection<T> c = source as ICollection<TSource>;
if (c != null)
return c.Count;
int result = 0;
using (IEnumerator<T> enumerator = source.GetEnumerator())
{
while (enumerator.MoveNext())
result++;
}
return result;
因此,它嘗試強制轉換為ICollection<T>具有Count屬性的,并在可能的情況下使用它。否則進行迭代。
因此,最好的選擇是Count()在IEnumerable<T>對象上使用擴展方法,因為那樣會獲得最佳性能。
TA貢獻1840條經驗 獲得超5個贊
只需添加一些額外的信息:
該Count()擴展并不總是迭代??紤]將Linq轉換為Sql,其中將計數發送到數據庫,但是它不帶回所有行,而是發出Sql Count()命令并返回該結果。
另外,編譯器(或運行時)足夠聰明,Count()如果有的話,它將調用objects 方法。因此,它不是像其他響應者所說的那樣,完全無知并且總是為了計數元素而反復進行。
在許多情況下,程序員只是if( enumerable.Count != 0 )使用Any()擴展方法進行檢查,因為if( enumerable.Any() ) linq的惰性評估會更有效,因為一旦確定有任何元素,它就會短路。它也更具可讀性
- 3 回答
- 0 關注
- 468 瀏覽
添加回答
舉報
