.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新特性试用 | 总结:我最喜欢的5个特性
前言 不知不觉,<.NET 6新特性试用>系列文章已经写了20多篇,而今天终于要告一段落了. 如果你还没有看过,详细文章列表在这里: .NET 6新特性试用系列 在这么多特性中,我最喜欢如 ...
- .NET 6新特性试用 | 可空引用类型
前言 在查看<隐式using指令>功能时,我们在csproj中发现这样一个属性: 那么,Nullable到底是干嘛的? 可为空上下文 严格来说,这不是新特性,而是C# 8.0引入的特性之一 ...
- 5.0 新特性试用体验之 Clustered Index
作者:hzc989 原文来源: https://tidb.net/blog/69dd056c [是否原创]是 [首发渠道]TiDB 社区 [目录] 一.引言 二.基础前情回顾 三.era withou ...
- .NET 6新特性试用 | PeriodicTimer
前言 在.NET中,已经存在了5个Timer类: System.Threading.Timer System.Timers.Timer System.Web.UI.Timer System.Windo ...
- .NET 6新特性试用 | 可写JSON DOM API
前言 我们常用JSON的方式,是将类对象序列化/反序列化: var user = new User { Name = "My IO" }; var json = JsonSeria ...
- .NET 6新特性试用 | SDK工作负载
前言 为了应对.NET SDK能够支持的程序集项目(例如iOS.Android.WASM)的不断增长,从.NET 6开始,允许用户仅安装必要的SDK(例如ASP.NET Core),而不是一次性安装& ...
- .NET 6新特性试用 | LINQ功能改进
前言 .NET6为LINQ添加了多个新API,在本文中,我们将始终使用User类逐一演示这些添加到LINQ中的内容: public class User {public string Name { g ...
- .NET 6新特性试用 | ArgumentNullException卫语句
前言 在前面的文章中(<可空引用类型>),我们介绍过编译器会帮我们检查空引用,但是仅仅是警告.最好的方式还是在运行时用卫语句进行检查: private void Test(WeatherF ...
- .NET 6新特性试用 | 热重载
前言 在以前的开发模式下,我们修改代码后必须重新编译.重新运行才能看到效果. 而热重载提供了这样一种特性,它允许你在项目正在运行时修改代码,并将代码更改立即应用于正在运行的应用程序上. 热重载的目的是 ...
最新文章
- RESTful API 设计最佳实践
- 如何用原生js替换字符串中的某个字符(或字符串)为指定的字符串?
- 1.3 Integer类详解
- Oracle 工具权限二
- 微软统一预训练语言模型UniLM 2.0解读
- Flask碰到 原因:CORS 头缺少 'Access-Control-Allow-Origin'解决方案 解决
- 解决Linux新安装的虚拟机没有网
- 镜像体积减小_docker镜像从1.16G优化到22M
- python界面卡顿_前端页面卡顿、也许是DOM操作惹的祸?
- SQL Server 加密案例解析
- nlp中region_百度5年深耕NLP 他把聊天机器人变成你的“全科医生”
- java根据距离算经纬度_java 根据两点经纬度来算距离
- 毕业论文word版 格式设置技巧
- 如果这篇文章说不清epoll的本质,那就过来掐死我吧
- SOJ4480 Easy Problem IV (并查集)
- wannier拟合能带总是拟合不上_Wannier 90使用教程
- Video IP:Video_In_to_AXI4-stream
- Flash打开其他外部EXE软件
- 微信客服为什么不能人工服务器,微信客服消息格式限制及功能
- Resharper快捷键使用
热门文章
- Job make U funck Uself!!!
- IIS 权限错误(401.1 401.2 401.3)解决办法
- 被娱乐在线报道的“唐骏造假门事件”
- day22 Java学习 IO流(序列流)
- spring cloud连载第一篇之bootstrap context
- Robot Framework 教程 (3) - Resource及关键字 的使用
- 驱动之LCD的介绍与应用20170209
- Windows服务二:测试新建的服务、调试Windows服务
- UIView 的基础
- [Java] java中的接口定义