.NET 6新特性试用 | TryGetNonEnumeratedCount
前言
.NET 6新增了TryGetNonEnumeratedCount方法,計(jì)算可枚舉類型的元素總數(shù)。
LINQ不是已經(jīng)有了Count方法嗎,為什么還要畫蛇添足呢?
Demo
嘗試下列代碼:
var?b?=?new?B<int>(); Console.WriteLine($@"{b.Count()}");var?a?=?new?A<int>(); Console.WriteLine($@"{a.Count()}");class?A<T>?:?IEnumerable<T> {public?IEnumerator<T>?GetEnumerator(){throw?new?NotImplementedException();}IEnumerator?IEnumerable.GetEnumerator(){throw?new?NotImplementedException();} }class?B<T>?:?A<T>,ICollection {public?int?Count?=>?10086;public?bool?IsSynchronized?=>?throw?new?NotImplementedException();public?object?SyncRoot?=>?throw?new?NotImplementedException();public?void?CopyTo(Array?array,?int?index){throw?new?NotImplementedException();} }你會(huì)發(fā)現(xiàn),b.Count()能夠執(zhí)行,而a.Count()會(huì)報(bào)錯(cuò):?
原理
這是由LINQ內(nèi)部實(shí)現(xiàn)造成的。
對(duì)于某些集合類型,如果無法快速確定集合元素?cái)?shù)量——例如Count屬性,調(diào)用Count()則必須枚舉整個(gè)集合以確定元素的數(shù)量。
在某些情況下,枚舉會(huì)嚴(yán)重影響程序性能,比如EF Core下使用IQueryable.Count()就需要訪問數(shù)據(jù)庫獲取全部記錄才能計(jì)數(shù)。
因此,更高效地計(jì)算序列中的元素?cái)?shù),就是使用TryGetNonEnumeratedCount方法,如果可以快速計(jì)數(shù),該方法將返回true并將計(jì)數(shù)作為out變量返回。
結(jié)論
建議你始終使用以下格式代碼,去獲取可枚舉類型的元素總數(shù):
if?(!enumerable.TryGetNonEnumeratedCount(out?var?count)) {//使用其他方式獲取元素?cái)?shù)量 }如果你覺得這篇文章對(duì)你有所啟發(fā),請(qǐng)關(guān)注我的個(gè)人公眾號(hào)”My IO“
總結(jié)
以上是生活随笔為你收集整理的.NET 6新特性试用 | TryGetNonEnumeratedCount的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 云原生架构师训练营(系统架构)
- 下一篇: C# Jpush 极光推送消息推送