.NET 6新特性试用之TryGetNonEnumeratedCount 方法

2022-04-17 13:33:07
目录
前言:一、举例二、原理结论:

前言:

.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<TmkciO>{  public IEnumerator<T> GetEnumerator()  {    throw new NotImplementedException();  }  IEnumerator IEnumerable.GetEnumerator()  {    thrmkciOow new NotImplementedException();  }}class B<T> : A<T>,ICollection{  pumkciOblic 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()​​会报错: 

.NET6新特性试用之TryGetNonEnumeratedCount方法

二、原理

这是由LINQ内部实现造成的。

对于某些集合类型,如果无法快速确定集合元素数量——例如Count属性,调用​​Count()​​则必须枚举整个集合以确定元素的数量。

在某些情况下,枚举会严重影响程序性能,比如EF Core下使用​​IQueryable.Count()​​就需要访问数据库获取全部记录才能计数。

因此,更高效地计算序列中的元素数,就是使用​​TryGetNonEnumeratedCount​​方法,如果可以快速计数,该方法将返回true并将计数作为out变量返回。

结论:

建议你始终使用以下格式代码,去获取可枚举类型的元素总数:

if (!enumerable.TryGetNonEnumeratedCount(out var count)){  //使用其他方式获取元素数量}