.NET 6新特性试用 | TryGetNonEnumeratedCount

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.NET 6新特性试用 | TryGetNonEnumeratedCount相关的知识,希望对你有一定的参考价值。

前言

.NET 6新增了TryGetNonEnumeratedCount方法,计算可枚举类型的元素总数。

LINQ不是已经有了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();
    

你会发现,b.Count()能够执行,而a.Count()会报错: 

原理

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

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

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

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

结论

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

if (!enumerable.TryGetNonEnumeratedCount(out var count))

    //使用其他方式获取元素数量

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“

以上是关于.NET 6新特性试用 | TryGetNonEnumeratedCount的主要内容,如果未能解决你的问题,请参考以下文章

.NET 6新特性试用 | PeriodicTimer

.NET 6新特性试用 | 可空引用类型

.NET 6新特性试用 | TryGetNonEnumeratedCount

.NET 6新特性试用 | PriorityQueue

.NET 6新特性试用 | 无需配置开发人员异常页

.NET 6新特性试用 | 异步流