C# Linq源码分析之Take (一)

这篇具有很好参考价值的文章主要介绍了C# Linq源码分析之Take (一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概要

在.Net 6 中引入的Take的另一个重载方法,一个基于Range的重载方法。因为该方法中涉及了很多新的概念,所以在分析源码之前,先将这些概念搞清楚。

后续代码分析,请参考 C# Linq源码分析之Take (二)

Take方法基本介绍

public static System.Collections.Generic.IEnumerable Take (this System.Collections.Generic.IEnumerable source, Range range);

新的Take重载方法不再接收整数参数,而是接收一个Range类型的参数。它可以从序列中返回指定范围的连续元素。

注意:该方法只能在.Net 6 或更高版本中使用,我们之前用的.Net 4.7, 4.8或.Net Core 3.1中,都不支持该方法。

Range参数的数据结构

Take重载方法的参数是Range类型,Range本身是一个struct, 表示具有起始索引和结束索引的范围。

Range有两个重要的属性Start和End,表示Range的启始索引值和结束索引值,在Take 方法中只会取到结束索引值的前一个元素。

End和Start的属性的类型值是Index,也是struct结构。包含两个重要属性,Value和IsFromEnd。

IsFromEnd是bool类型,表示是正数还是倒数,例如我们可以写成3…^1 表示从第三个到倒数第一个。

Value是int类型,表示索引值。无论是1 或^1, 索引值都是1。

Take 方法的基本使用

static void Main(string[] args)
{
    Range range = 1..3;
    List<string> list = new List<string> { "A", "B", "C", "D", "E", "F", "G" };
    foreach(var val in list.Take(range))
    {
        Console.WriteLine(val);
    }
}

输出结果是 B 和 C

C#中对Range的定义与Python类似。
C#中可以按照正数的方式设定Range,也可以按照倒数的方式设定,也可以按照正数和倒数的混合方式设定Range。

C# Linq源码分析之Take (一),.Net,.Net Core,C#基础,c#,linq,开发语言

上述代码中,我们将Range定义为Range range = ^6…3;,也可以得到相同的结果。

但是需要注意的是,Take方法中的Range必须是有意义的,注意下面的情况:

  • ^1…3, 代人Take将得到空序列,因为无论正数还是倒数,Range的开始值必须小于结尾的值, 在上面例子中 ^1就是6,相当于去从第6个到第3个元素,显然是不合理的,结果为空。
  • 3…^4, 代人Take将得到空序列,该Range等价于取从第3个到第3个元素,结果是空。
  • 无论正数还是倒数,都可以越界,我们写成0…100或 ^100… ^1,都能拿到序列的全部元素,不会抛出越界异常。

Take中使用TryGetNonEnumeratedCount方法实现优化

TryGetNonEnumeratedCount方法的基本定义如下:

public static bool TryGetNonEnumeratedCount (this System.Collections.Generic.IEnumerable source, out int count);

该方法用于在不遍历序列元素的情况的下,获取序列中元素个数。

如果目标序列source实现了 ICollection接口,则需要实现Count属性。因此该函数可以直接获取Count属值,并返回True,输出参数count是序列中的元素个数。

如果目标序列source没有实现ICollection接口,则无法直接获取元素个数,因此该函数返回False,count是0。

Take 在执行过程中,如果我们的Range值设定的是倒数方式,我们就需要知道序列中元素的个数,然后将倒数值变成正数值,最后后按照索引取值。

试想如果目标序列数据量很大,如果可以直接获取序列中元素的个数,就可以避免逐个元素遍历,再获取序列中元素个数,可以实现优化,提高代码运行速度。文章来源地址https://www.toymoban.com/news/detail-656350.html

到了这里,关于C# Linq源码分析之Take (一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C# 基础精讲】LINQ 基础

    LINQ(Language Integrated Query)是一项强大的C#语言特性,它使数据查询和操作变得更加简洁、灵活和可读性强。通过使用LINQ,您可以使用类似SQL的语法来查询各种数据源,如集合、数组、数据库等。本文将介绍LINQ的基础概念、常见的LINQ操作和示例,以及如何在C#中利用LINQ进行数

    2024年02月12日
    浏览(31)
  • C#基础--Lambda和LINQ

    在.NetFramewok的不同版本都有不同的样子;在.NetCore下也都是支持的; 1.1 .Netframework1.0/1.1时代 1.2 .NetFramework2.0 匿名方法 增加了一个delegate, 可以访问到除了参数以外的局部变量 1.3 .NetFramework3.0 前期 去掉了delegate,添加了一个= goes to 1.4 .NetFramework3.0 后期 去掉了匿名

    2024年02月17日
    浏览(32)
  • C#基础:利用LINQ进行复杂排序

    请你写出linq对表格排序, CODE=3排前面 ,其余按照 CODE降序 排序,CODE一样再按照 字母升序 排序 ID CODE VALUE A0001 1 A A0002 1 B A0003 1 C A0004 2 D A0005 2 E A0006 2 F A0007 3 G A0008 3 H A0009 3 I A0010 4 J 若再加大难度,ID=A0005的排第一,然后CODE=3排前面,其余按照CODE降序排序,再按照字母升序排

    2024年01月18日
    浏览(28)
  • 【C# 基础精讲】LINQ to Objects查询

    LINQ to Objects是LINQ技术在C#中的一种应用,它专门用于对内存中的对象集合进行查询和操作。通过使用LINQ to Objects,您可以使用统一的语法来查询、过滤、排序、分组等操作各种.NET对象。本文将详细介绍LINQ to Objects的基本概念、常见的操作和示例,以帮助您更好地理解如何在

    2024年02月11日
    浏览(25)
  • 【C# 基础精讲】LINQ to XML查询

    LINQ to XML 是 C# 中用于查询和操作 XML 数据的强大工具。它允许您使用 LINQ 查询语法对 XML 文档进行查询、过滤、投影等操作,从而更加方便地处理 XML 数据。本文将详细介绍 LINQ to XML 的基本概念、常见操作以及示例,帮助您了解如何在 C# 中使用 LINQ to XML 进行 XML 数据的查询和

    2024年02月12日
    浏览(28)
  • 每个.NET开发都应掌握的linq知识点

    LINQ是C#3.0引入的特性,让处理对象就像执行SQL语句一样简单,对于提高C#开发效率有革命性的作用。 对于每个.NET开发者来说,掌握C#的LINQ知识点是非常重要的。LINQ是C#的一个强大的特性,它为数据查询和操作提供了简洁、统一的语法,使得数据处理变得更加直观和灵活。 以

    2024年02月14日
    浏览(42)
  • C# Linq 学会使用,学会自己编写Linq

    Linq我暂时理解为,一种内置的非常方便的数据查询的工具 我们先学习它的使用 //数据类 //新建了一个List数据,用来测试数据查询  //现在定义一个需求,需要查出 id2 的数据 引用Linq的命名空间  引用命名空间之后,我们的list对象,拥有了一个扩展方法,Where (扩展方法,在之前的博客

    2024年02月06日
    浏览(34)
  • EF.Core 使用Linq的Contact联合查询问题

    在.net Core 5 WebAPI 项目中应用 EF Core 5 实体框架,使用Linq的Contact联合进行多表查询。 定义两个子查询语句,查询结果 select 返回的对象结构类型都是一致的。 Linq查询结果集封装对象类: DatingComplaint 实体类映射(Fluent API): 但在执行到 ToListAsync() 代码行查询返回结果时,抛

    2024年02月13日
    浏览(37)
  • C# LINQ,SQL

    C#中的LINQ和SQL都是用于查询数据的工具,但它们有以下异同点: 异同点: 1. LINQ和SQL都可以用于查询数据,但LINQ是在C#中使用的语言集成查询,而SQL是一种独立的查询语言。 2. LINQ和SQL都支持基本的查询操作,如选择、过滤、排序和分组。 3. LINQ和SQL都支持连接多个表,但LI

    2024年02月10日
    浏览(29)
  • C# Linq 详解四

    目录 概述 二十、SelectMany 二十一、Aggregate 二十二、DistinctBy 二十三、Reverse 二十四、SequenceEqual 二十五、Zip 二十六、SkipWhile  二十七、TakeWhile C# Linq 文档(一) 1.Where,2.Select,3.GroupBy,4.First / FirstOrDefault,5.Last / LastOrDefault C# Linq 文档(二) 1.OrderBy ,2.OrderByDescending,3.Skip,

    2024年02月16日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包