.NET 6新特性试用之TryGetNonEnumeratedCount 方法
前言:
.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))
{
//使用其他方式获取元素数量
}
到此这篇关于.NET 6新特性试用之TryGetNonEnumeratedCount 方法的文章就介绍到这了,更多相关TryGetNonEnumeratedCount 方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341