时间:2022-09-27 11:11:39 | 栏目:.NET代码 | 点击:次
.NET 6新增了??TryGetNonEnumeratedCount??方法,计算可枚举类型的元素总数。
LINQ不是已经有了??Count??方法吗,为什么还要画蛇添足呢?
下文来看看具体情况!!!
尝试下列代码:
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(); } }
你会发现,??b.Count()???能够执行,而??a.Count()??会报错:
这是由LINQ内部实现造成的。
对于某些集合类型,如果无法快速确定集合元素数量——例如Count属性,调用??Count()??
则必须枚举整个集合以确定元素的数量。
在某些情况下,枚举会严重影响程序性能,比如EF Core下使用??IQueryable.Count()??
就需要访问数据库获取全部记录才能计数。
因此,更高效地计算序列中的元素数,就是使用??TryGetNonEnumeratedCount
??方法,如果可以快速计数,该方法将返回true并将计数作为out变量返回。
建议你始终使用以下格式代码,去获取可枚举类型的元素总数:
if (!enumerable.TryGetNonEnumeratedCount(out var count)) { //使用其他方式获取元素数量 }