亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從IEnumerable <T>計算項目而不進行迭代?

從IEnumerable <T>計算項目而不進行迭代?

嗶嗶one 2019-10-25 10:30:09
private IEnumerable<string> Tables{    get    {        yield return "Foo";        yield return "Bar";    }}假設我要迭代這些并編寫類似#m的#n處理。有沒有一種方法可以在我的主迭代之前不進行迭代就找出m的值?我希望我能說清楚。
查看完整描述

3 回答

?
慕少森

TA貢獻2019條經驗 獲得超9個贊

IEnumerable不支持這一點。這是設計使然。IEnumerable使用惰性評估來獲取您需要的元素,然后再使用它們。


如果您想在不迭代的情況下知道項目的數量,可以使用ICollection<T>,它具有一個Count屬性。


查看完整回答
反對 回復 2019-10-25
?
慕斯王

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>對象上使用擴展方法,因為那樣會獲得最佳性能。


查看完整回答
反對 回復 2019-10-25
?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

只需添加一些額外的信息:


該Count()擴展并不總是迭代??紤]將Linq轉換為Sql,其中將計數發送到數據庫,但是它不帶回所有行,而是發出Sql Count()命令并返回該結果。


另外,編譯器(或運行時)足夠聰明,Count()如果有的話,它將調用objects 方法。因此,它不是像其他響應者所說的那樣,完全無知并且總是為了計數元素而反復進行。


在許多情況下,程序員只是if( enumerable.Count != 0 )使用Any()擴展方法進行檢查,因為if( enumerable.Any() ) linq的惰性評估會更有效,因為一旦確定有任何元素,它就會短路。它也更具可讀性


查看完整回答
反對 回復 2019-10-25
  • 3 回答
  • 0 關注
  • 468 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號