写点什么

.NET6 新东西 ---TryGetNonEnumeratedCount

作者:喵叔
  • 2021 年 12 月 26 日
  • 本文字数:726 字

    阅读完需:约 2 分钟

在.NET6 中微软新增了 TryGetNonEnumeratedCount 方法,让我们可以计算可枚举类型元素的总数。到这里一定有读者会问:LINQ 中已经包含了 Count 方法,为什么还要增加 TryGetNonEnumeratedCount 方法呢?要解决这个问题,我们先来看一段代码:


var u = new User<int>();Console.WriteLine($@"{u.Count()}");var e = new Employee<int>();Console.WriteLine($@"{e.Count()}");class User<T> : IEnumerable<T>{    public IEnumerator<T> GetEnumerator()    {        throw new NotImplementedException();    }
IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); }}
class Employee<T> : User<T>, ICollection{ public int Count => 123456;
public bool IsSynchronized => throw new NotImplementedException();
public object SyncRoot => throw new NotImplementedException();
public void CopyTo(Array array, int index) { throw new NotImplementedException(); }}
复制代码


运行上面的代码会发现 e.Count()能够执行,但是 u.Count()报错,这是 LINQ 内部实现造成的。某些集合类型如果无法通过 Count 属性/方法确定集合元素数量的话,会严重影响程序性能,这是因为 Count 属性/方法必须枚举整个集合来确定元素数量,例如 EF Core 中使用 IQueryable.Count()方法需要访问数据库获取全部记录才能计算总数。为了解决这个问题我们就需要使用 TryGetNonEnumeratedCount 方法,如果可以快速计数,该方法将返回 true 并将计数作为 out 变量返回。因此建议在代码中始终使用如下方式获取可枚举类型的元素总数:


if (!enumerable.TryGetNonEnumeratedCount(out var count)){    //more code}
复制代码


用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
.NET6新东西---TryGetNonEnumeratedCount