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

目录
  • 前言:
  • 一、举例
  • 二、原理
  • 结论:

前言:

.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<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))
{
    //使用其他方式获取元素数量
}

到此这篇关于.NET 6新特性试用之TryGetNonEnumeratedCount 方法的文章就介绍到这了,更多相关TryGetNonEnumeratedCount 方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • .NET 6新特性试用之System.Text.Json功能改进

    目录 前言: Demo ​1.属性排序​ ​2.序列化通知​ 结论: 前言: ​​System.Text.Json​​作为.NET默认的JSON序列化和反序列化类库,让我们看看,在.NET 6中有哪些功能上的改进? Demo ​1.属性排序​ 在属性上声明​​JsonPropertyOrderAttribute​​来控制属性序列化的顺序,而以前,顺序是由反射顺序决定的,是不确定的. 示例代码如下: public class User {     public int Age { get; set

  • .NET 6新特性试用之常量内插字符串

    目录 前言: 一.常量内插字符串 结论: 前言: 编写代码时,我们常常需要组合字符串. 如下代码: string scheme = "https"; string host = "xxx.com"; int port = 8080; Console.WriteLine(string.Format("{0}://{1}:{2}", scheme, host, port)); 但是,这种替换方式容易会产生错误,比如写错参数顺序,索引数字无效等. 因此

  • .NET 6新特性试用之DateOnly和TimeOnly类型

    目录 前言: 举例 ​1.创建实例​ ​2.类型转换​ ​3.操作​ 结论: 前言: 在.NET 6之前,没有方法来直接表示没有时间的日期(比如生日)或者没有日期的一天中的时间(比如闹钟). 虽然我们可以使用DateTime类和TimeSpan类来代替,但是实际使用中会存在一些问题: var dateOnly = new DateTime(2021, 10, 1); //输出 2021/10/1 0:00:00 //问题:还是有时间,并不能代表0点出生 var timeOnly = new Ti

  • 基于 .NET 6 的ASP.NET Core启动地址配置方法及优先级顺序

    目录 前言: 一.设置方法 ​1.applicationUrl属性​ ​2.环境变量​ ​3.命令行参数​ ​4.UseUrls方法​ .NET5版本 .NET6版本 ​5.UseKestrel方法​ ​6.WebApplication.Urls.Add方法​ ​7.appsettings.json文件​ 二.优先级 三.结论 前言: 上次,我们讨论了如何通过配置或代码方式修改启动地址:<​ ​ASP.NET Core启动地址配置方法及优先级顺序​​>.不过是基于 .NET 5 版本的. 由于

  • .NET 6新特性试用之Nuget包验证

    目录 前言: Demo 结论: 前言: 我们常常需要将.NET类库打包成Nuget包,以便多个项目公用. 一旦修改类库,​尽管代码可以运行​,并成功打包成新版本​,看起来一切正常​,​但是​你无法保证该更改是安全且兼容的. 而在.Net 6中,提供了包验证工具,帮助我们检测这一点. Demo 使用方式也非常简单,只需修改项目文件,加上​​EnablePackageValidation​​属性: <EnablePackageValidation>true</EnablePackageVal

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

    目录 前言: 一.举例 二.原理 结论: 前言: .NET 6新增了​​TryGetNonEnumeratedCount​​方法,计算可枚举类型的元素总数. LINQ不是已经有了​​Count​​方法吗,为什么还要画蛇添足呢? 下文来看看具体情况!!! 一.举例 尝试下列代码: var b = new B<int>(); Console.WriteLine($@"{b.Count()}"); var a = new A<int>(); Console.Write

  • .NET 6新特性试用之DateOnly和TimeOnly类型

    目录 前言: 举例 ​1.创建实例​ ​2.类型转换​ ​3.操作​ 结论: 前言: 在.NET 6之前,没有方法来直接表示没有时间的日期(比如生日)或者没有日期的一天中的时间(比如闹钟). 虽然我们可以使用DateTime类和TimeSpan类来代替,但是实际使用中会存在一些问题: var dateOnly = new DateTime(2021, 10, 1); //输出 2021/10/1 0:00:00 //问题:还是有时间,并不能代表0点出生 var timeOnly = new Ti

  • .NET 6新特性试用Timer类之PeriodicTimer 

    目录 前言: 一.Demo 结论: 前言: 在.NET中,已经存在了5个Timer类: System.Threading.Timer System.Timers.Timer System.Web.UI.Timer System.Windows.Forms.Timer System.Windows.Threading.DispatcherTimer 不管以前这样设计的原因,现在.NET 6又为我们增加了一个新Timer,​​PeriodicTimer​​. 这又是为什么呢? 一.Demo 与其他T

  • java8新特性之接口默认方法示例详解

    前言 JAVA8 已经发布很久,而且毫无疑问,java8 是自 java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和 JVM 等诸多方面的新特性.Java8 新特性列表如下: 接口默认方法 函数式接口 Lambda 表达式 方法引用 Stream Optional 类 Date API Base64 重复注解与类型注解 接口默认方法 1.什么是接口默认方法 从 Java8 开始,程序允许在接口中包含带有具体实现的方法,使用 default 修饰,这类方法就是默认方法.

  • .NET 6新特性试用之System.Text.Json功能改进

    目录 前言: Demo ​1.属性排序​ ​2.序列化通知​ 结论: 前言: ​​System.Text.Json​​作为.NET默认的JSON序列化和反序列化类库,让我们看看,在.NET 6中有哪些功能上的改进? Demo ​1.属性排序​ 在属性上声明​​JsonPropertyOrderAttribute​​来控制属性序列化的顺序,而以前,顺序是由反射顺序决定的,是不确定的. 示例代码如下: public class User {     public int Age { get; set

  • .NET 6新特性试用之常量内插字符串

    目录 前言: 常量内插字符串 结论: 前言: 编写代码时,我们常常需要组合字符串. 如下代码: string scheme = "https"; string host = "xxx.com"; int port = 8080; Console.WriteLine(string.Format("{0}://{1}:{2}", scheme, host, port)); 但是,这种替换方式容易会产生错误,比如写错参数顺序,索引数字无效等. 因此,推

随机推荐