前言

.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相关推荐

  1. .NET 6新特性试用 | 总结:我最喜欢的5个特性

    前言 不知不觉,<.NET 6新特性试用>系列文章已经写了20多篇,而今天终于要告一段落了. 如果你还没有看过,详细文章列表在这里: .NET 6新特性试用系列 在这么多特性中,我最喜欢如 ...

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

    前言 在查看<隐式using指令>功能时,我们在csproj中发现这样一个属性: 那么,Nullable到底是干嘛的? 可为空上下文 严格来说,这不是新特性,而是C# 8.0引入的特性之一 ...

  3. 5.0 新特性试用体验之 Clustered Index

    作者:hzc989 原文来源: https://tidb.net/blog/69dd056c [是否原创]是 [首发渠道]TiDB 社区 [目录] 一.引言 二.基础前情回顾 三.era withou ...

  4. .NET 6新特性试用 | PeriodicTimer

    前言 在.NET中,已经存在了5个Timer类: System.Threading.Timer System.Timers.Timer System.Web.UI.Timer System.Windo ...

  5. .NET 6新特性试用 | 可写JSON DOM API

    前言 我们常用JSON的方式,是将类对象序列化/反序列化: var user = new User { Name = "My IO" }; var json = JsonSeria ...

  6. .NET 6新特性试用 | SDK工作负载

    前言 为了应对.NET SDK能够支持的程序集项目(例如iOS.Android.WASM)的不断增长,从.NET 6开始,允许用户仅安装必要的SDK(例如ASP.NET Core),而不是一次性安装& ...

  7. .NET 6新特性试用 | LINQ功能改进

    前言 .NET6为LINQ添加了多个新API,在本文中,我们将始终使用User类逐一演示这些添加到LINQ中的内容: public class User {public string Name { g ...

  8. .NET 6新特性试用 | ArgumentNullException卫语句

    前言 在前面的文章中(<可空引用类型>),我们介绍过编译器会帮我们检查空引用,但是仅仅是警告.最好的方式还是在运行时用卫语句进行检查: private void Test(WeatherF ...

  9. .NET 6新特性试用 | 热重载

    前言 在以前的开发模式下,我们修改代码后必须重新编译.重新运行才能看到效果. 而热重载提供了这样一种特性,它允许你在项目正在运行时修改代码,并将代码更改立即应用于正在运行的应用程序上. 热重载的目的是 ...

最新文章

  1. RESTful API 设计最佳实践
  2. 如何用原生js替换字符串中的某个字符(或字符串)为指定的字符串?
  3. 1.3 Integer类详解
  4. Oracle 工具权限二
  5. 微软统一预训练语言模型UniLM 2.0解读
  6. Flask碰到 原因:CORS 头缺少 'Access-Control-Allow-Origin'解决方案 解决
  7. 解决Linux新安装的虚拟机没有网
  8. 镜像体积减小_docker镜像从1.16G优化到22M
  9. python界面卡顿_前端页面卡顿、也许是DOM操作惹的祸?
  10. SQL Server 加密案例解析
  11. nlp中region_百度5年深耕NLP 他把聊天机器人变成你的“全科医生”
  12. java根据距离算经纬度_java 根据两点经纬度来算距离
  13. 毕业论文word版 格式设置技巧
  14. 如果这篇文章说不清epoll的本质,那就过来掐死我吧
  15. SOJ4480 Easy Problem IV (并查集)
  16. wannier拟合能带总是拟合不上_Wannier 90使用教程
  17. Video IP:Video_In_to_AXI4-stream
  18. Flash打开其他外部EXE软件
  19. 微信客服为什么不能人工服务器,微信客服消息格式限制及功能
  20. Resharper快捷键使用

热门文章

  1. Job make U funck Uself!!!
  2. IIS 权限错误(401.1 401.2 401.3)解决办法
  3. 被娱乐在线报道的“唐骏造假门事件”
  4. day22 Java学习 IO流(序列流)
  5. spring cloud连载第一篇之bootstrap context
  6. Robot Framework 教程 (3) - Resource及关键字 的使用
  7. 驱动之LCD的介绍与应用20170209
  8. Windows服务二:测试新建的服务、调试Windows服务
  9. UIView 的基础
  10. [Java] java中的接口定义