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

news2024/11/25 2:54:03

概要

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

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。

在这里插入图片描述

上述代码中,我们将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值设定的是倒数方式,我们就需要知道序列中元素的个数,然后将倒数值变成正数值,最后后按照索引取值。

试想如果目标序列数据量很大,如果可以直接获取序列中元素的个数,就可以避免逐个元数遍历,再获取序列中元素个数,可以实现优化,提高代码运行速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/876569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jeecgboot table 单元格横向和纵向合并

customRender: (value, row, index) > {const obj {children: &#xffe5;200200火力值,attrs: {}}if (index 0) {// obj.attrs.rowSpan this.dataSource.length // 合并数量 纵向合并obj.attrs.colSpan 3 // 横向合并}if (index > 1) {// obj.attrs.rowSpan 0 // …

2023上半年京东手机行业品牌销售排行榜(京东数据平台)

后疫情时代&#xff0c;不少行业都迎来消费复苏&#xff0c;我国智能手机市场在今年上半年也实现温和的复苏&#xff0c;手机市场的出货量回暖。 根据鲸参谋平台的数据显示&#xff0c;2023年上半年&#xff0c;京东平台上手机的销量为2830万&#xff0c;环比增长约4%&#xf…

注解@ConfigurationProperties获取配置文件内容 (demo)

1. 自定义配置文件内容 2. ConfigurationProperties import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component;Data Component ConfigurationProperties(prefix"wx-pay.v3&qu…

从密码重置打到Getshell和其它漏洞打包

前言&#xff1a; 前几天是准备上点edusrc的分的所以就准备用手上还没刷的Nday继续上分&#xff0c;然后就有了今天这个案例&#xff1a; 信息收集&#xff1a; 之前在挖某体育学院证书的时候就挖到过一个通过修改html文件更改密码修改步骤的漏洞 所以就准备测绘一下这个资产…

dataset中图像处理提速小技巧

图像增广中&#xff0c;边缘填充颜色写元组还是写单一数值 一&#xff0c;写元组&#xff1a; self.border_fill_value 114, 114, 114 # 定义为元组# 仿射变换的时候的写法&#xff1a;merge_mosaic_image cv2.warpAffine(merge_mosaic_image, M, (self.image_size, self.…

【uniapp】微信小程序,取视频第一帧,前提是 图片是在 阿里云的oss上

上传视频等&#xff0c;默认为黑色&#xff0c;无法用视频的第一帧作为封面&#xff0c;以及视频的video为原生组件&#xff0c;层级很高无法覆盖问题&#xff0c;虽然有cover-view&#xff0c;但很多场景还是不灵活 实现的前提条件是 图片是在 阿里云的oss上 自己服务器是…

SpringCloud中 Sentinel 限流的使用

引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>手动编写限流规则&#xff0c;缺点是不够灵活&#xff0c;如果需要改变限流规则需要修改源码…

【GitOps系列】如何解决 GitOps 的秘钥存储问题?

文章目录 简介GitOps 密钥管理方案安装 Sealed-Secrets安装 CLI 工具安装 Controller 控制器 示例应用介绍创建 ArgoCD 应用创建加密后的 Secret 对象创建 Image Pull Secret 对象创建 Secret 对象推送到代码仓库验证 Secret 原理解析核心关注点 简介 在实际的业务场景下&…

1.SpringMVC接收请求参数及数据回显:前端url地址栏传递参数通过转发显示在网页

1、SpringMVC 处理前端提交的数据 1.1 提交的域名和处理方法的参数不一致&#xff0c;使用注解解决 1.2 提交的域名和处理方法的参数不一致&#xff0c;使用注解解决 1.3 提交的是一个对象 2、前端url地址栏传递的是一个参数 请求地址url&#xff1a;http://localhost:8080/s…

openGauss学习笔记-39 openGauss 高级数据管理-分区表

文章目录 openGauss学习笔记-39 openGauss 高级数据管理-分区表39.1 范围分区表的分类39.2 创建范围分区39.2.1 创建VALUES LESS THAN范围分区表语法格式39.2.2 创建VALUES LESS THAN范围分区表参数说明39.2.3 创建VALUES LESS THAN范围分区表示例 39.3 询分区表39.3.1 查询分区…

el-table自适应缩放大小

安装依赖 npm install --save vue-draggable-resizable //或 cnpm install --save vue-draggable-resizablemain.js引入依赖 import VueDraggableResizable from vue-draggable-resizable import "vue-draggable-resizable/dist/VueDraggableResizable.css"; Vue.c…

Haproxy+Keepalived高可用部署

环境准备&#xff1a; IPVIPmasterhaproxy192.168.134.170192.168.134.100backuphaproxy192.168.134.172192.168.134.100web1192.168.134.171web2192.168.134.173web3192.168.134.174 1、首先配置啊三台web服务器&#xff0c;并写好测试页面。 web1&#xff08;配置jsp页面&…

Wlan——CAPWAP协议的报文格式与报文封装

目录 CAPWAP报文携带信息 Discovery报文&#xff08;AP先发&#xff09; Join报文&#xff08;AP先发&#xff09; Configuration Status报文&#xff08;AP先发&#xff09; Change State报文&#xff08;AP先发&#xff09; Echo报文&#xff08;AP和AC都可以先发&…

2023 CCF BDCI 数字安全公开赛正式开启报名

2023 CCF BDCI 数字安全公开赛重磅来袭&#xff01; 全新的赛道场景 丰厚的赛事奖励 精彩的周边活动 数字安全守护人的狂欢盛宴 快来报名参加吧 大赛背景 伴随着数智化的持续加深&#xff0c;网络安全、数据安全风险遍布于所有场景之中&#xff0c;包括工业生产、能源、交…

SSH远程连接MacOS catalina并进行终端颜色配置

一、开关SSH服务 在虚拟机上安装了MacOS catalina&#xff0c;想要使用SSH远程进行连接&#xff0c;但是使用“系统偏好设置”/“共享”/“远程登录”开关进行打开&#xff0c;却一直是正在启动“远程登录”&#xff1a; 难道是catalina有BUG&#xff1f;不过还是有方法的&…

2023年许战海咨询《竞争之王CEO年度辅导工程》火热招募中

今天产业迭代速度不断加剧,人类知识更迭周期大大压缩到2年以内,企业遭遇更多挑战:如增长乏力、品牌老化、竞争压力大、竞争方向不明确、产品同质化、利润越来越低、团队执行难等。《竞争之王CEO年度辅导工程》应运而生,旨在手把手辅导企业家及高管团队如何制定战略和落地战略&a…

Wireshark有线网卡抓包报错The capture session could not be initiated on capture device

最近在使用Wireshark进行抓包排错时&#xff0c;选择网卡后提示报错&#xff0c;在此之前从未出现过&#xff0c;报错内容如下&#xff1a; 提示内容是The capture session could not be initiated on capture device&#xff0c;无法在捕获设备上启动捕获会话要求操作是Please…

解密人工智能:线性回归 | 逻辑回归 | SVM

文章目录 1、机器学习算法简介1.1 机器学习算法包含的两个步骤1.2 机器学习算法的分类 2、线性回归算法2.1 线性回归的假设是什么&#xff1f;2.2 如何确定线性回归模型的拟合优度&#xff1f;2.3 如何处理线性回归中的异常值&#xff1f; 3、逻辑回归算法3.1 什么是逻辑函数?…

5.0 Spring Boot核心

1. Spring Boot注解 注解名称 注解说明 SpringBootApplication 用于标注Spring Boot应用为启动类&#xff0c;是一个组合注解&#xff0c;主要组合了SpringBootConfiguration、EnableAutoConfiguration和ComponentScan注解 SpringBootConfiguration 继承自Configuration&a…

以开放促发展 同创永益召开数字韧性生态交流会

8月3日&#xff0c;同创永益数字韧性生态交流会在北京总部举办&#xff0c;30多家合作伙伴、渠道商齐聚一堂&#xff0c;围绕同创永益品牌、产品、行业解决方案进行充分探讨&#xff0c;共话行业前瞻趋势&#xff0c;共绘跨越增长新蓝图。 活动开始前&#xff0c;同创永益渠道管…