3 回答

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊
IEnumerable不支持這一點(diǎn)。這是設(shè)計(jì)使然。IEnumerable使用惰性評(píng)估來獲取您需要的元素,然后再使用它們。
如果您想在不迭代的情況下知道項(xiàng)目的數(shù)量,可以使用ICollection<T>,它具有一個(gè)Count屬性。

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊
的System.Linq.Enumerable.Count擴(kuò)展方法IEnumerable<T>具有以下實(shí)現(xiàn):
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;
因此,它嘗試強(qiáng)制轉(zhuǎn)換為ICollection<T>具有Count屬性的,并在可能的情況下使用它。否則進(jìn)行迭代。
因此,最好的選擇是Count()在IEnumerable<T>對(duì)象上使用擴(kuò)展方法,因?yàn)槟菢訒?huì)獲得最佳性能。

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊
只需添加一些額外的信息:
該Count()擴(kuò)展并不總是迭代??紤]將Linq轉(zhuǎn)換為Sql,其中將計(jì)數(shù)發(fā)送到數(shù)據(jù)庫,但是它不帶回所有行,而是發(fā)出Sql Count()命令并返回該結(jié)果。
另外,編譯器(或運(yùn)行時(shí))足夠聰明,Count()如果有的話,它將調(diào)用objects 方法。因此,它不是像其他響應(yīng)者所說的那樣,完全無知并且總是為了計(jì)數(shù)元素而反復(fù)進(jìn)行。
在許多情況下,程序員只是if( enumerable.Count != 0 )使用Any()擴(kuò)展方法進(jìn)行檢查,因?yàn)閕f( enumerable.Any() ) linq的惰性評(píng)估會(huì)更有效,因?yàn)橐坏┐_定有任何元素,它就會(huì)短路。它也更具可讀性
- 3 回答
- 0 關(guān)注
- 453 瀏覽
添加回答
舉報(bào)