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

概要

在.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.pswp.cn/news/37720.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37720.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37720.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【LeetCode: 2811. 判斷是否能拆分數組】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

NavMeshPlus 2D尋路插件

插件地址:h8man/NavMeshPlus&#xff1a; Unity NavMesh 2D Pathfinding (github.com) 我對Unity官方是深惡痛覺,一個2D尋路至今都沒想解決,這破引擎早點倒閉算了. 這插件是githun的開源項目,我本身是有寫jps尋路的,但是無法解決多個單位互相阻擋的問題(可以解決但是有性能問…

vue3+ts使用antv/x6 + 自定義節點

使用 2.x 版本 x6.antv 新官網: 安裝 npm install antv/x6 //"antv/x6": "^2.1.6",項目結構 1、初始化畫布 index.vue <template><div id"container"></div> </template><script setup langts> import { onM…

Python爬蟲——scrapy_基本使用

安裝scrapy pip install scrapy創建scrapy項目&#xff0c;需要在終端里創建 注意&#xff1a;項目的名字開頭不能是數字&#xff0c;也不能包含中文 scrapy startproject 項目名稱 示例&#xff1a; scrapy startproject scra_baidu_36創建好后的文件 3. 創建爬蟲文件&…

MySQL表的操作

文章目錄 MySQL表的操作1. 創建表2. 查看表2.1 查看數據庫中存在的表2.2 查看表的屬性2.3 查看創建時表的詳細信息 3. 修改表3.1 向表中添加記錄3.2 添加列3.3 修改列的數據類型3.4 刪除列3.5 表的重命名3.6 修改列名 4. 刪除表 MySQL表的操作 1. 創建表 CREATE TABLE table_…

博客系統【架構】

用戶管理 實現用戶的注冊、登錄、注銷等功能 使用Redis做緩存處理、阿里云短信服務 確保用戶身份驗證和安全性 使用Jwt來鑒權 userId (主鍵&#xff0c;自增長) username (唯一&#xff0c;用戶名)【用于普通登錄】email (唯一&#xff0c;用戶的電子郵件地址) password (存儲…

zabbix監控tomcat

一、zabbix監控Tomcat1.1 zbx-agent配置1.1.1 關閉防火墻&#xff0c;將安裝 Tomcat 所需軟件包傳到/opt目錄下1.1.2 安裝JDK1.1.3 設置JDK環境變量1.1.4 安裝啟動Tomcat1.1.5 配置 JMX 1.2 zbx-server配置1.2.1 安裝zabbix&#xff08;省略&#xff0c;可看上一篇博客&#xf…

Docker自動化部署安裝(十)之安裝SonarQube

這里選擇的是&#xff1a; sonarqube:9.1.0-community (推薦使用) postgres:9.6.23 數據庫(sonarqube7.9及以后便不再支持mysql&#xff0c;版本太低的話里面的一些插件會下載不成功的) 1、docker-sonarqube.yml文件 version: 3 services:sonarqube:container_name: sonar…

Redis詳解

Redis 簡介 Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的高性能鍵值對存儲數據庫&#xff0c;最初由 Salvatore Sanfilippo 開發&#xff0c;它在內存中存儲數據&#xff0c;并提供了持久化功能&#xff0c;可以將數據保存到磁盤中&#xff0c;是一種N…

? vue中$forceUpdate()

? vue中$forceUpdate() 1、認識 強制該組件重新渲染 鑒于 Vue 的全自動響應性系統&#xff0c;這個功能應該很少會被用到 $forceUpdate()迫使vue實例重新&#xff08;rander&#xff09;渲染虛擬DOM&#xff0c;注意并不是重新加載組件。 結合vue的生命周期&#xff0c;調用…

【論文閱讀】DEPCOMM:用于攻擊調查的系統審核日志的圖摘要(SP-2022)

Xu Z, Fang P, Liu C, et al. Depcomm: Graph summarization on system audit logs for attack investigation[C]//2022 IEEE Symposium on Security and Privacy (SP). IEEE, 2022: 540-557. 1 摘要 ? 提出了 DEPCOMM&#xff0c;這是一種圖摘要方法&#xff0c;通過將大圖劃…

簡單易懂的python生成器

目錄 定義使用 for 循環來迭代生成器對象斐波那契 定義 在 Python 中&#xff0c;使用了 yield 的函數被稱為生成器&#xff08;generator&#xff09;。Python 中的生成器&#xff08;Generator&#xff09;是一種特殊的迭代器&#xff0c;可以通過函數來創建。與常規函數不同…

Feign忽略Https的SSL最佳方案(且保證負載均衡將失效)

同時解決Https的SSL證書驗證問題和feign不支持Patch請求方法的問題 代碼 1. 工具類 OkHttpUtils.java import javax.net.ssl.*; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import j…

從0開始搭建ns3環境以及NetAnim簡單使用

一、環境準備 ns3是基于GNU/Linux平臺使用C開發的工具軟件&#xff0c;在windows系統中安裝使用ns3環境&#xff0c;可以使用虛擬機VMware并安裝ubuntu系統來實現&#xff0c;現將本教程所用到的虛擬機和系統鏡像放到網盤提供下載 名稱鏈接提取碼VMware Workstation 17 Proht…

簡約時尚的健康手表,智能守護每一刻,dido Y60上手

智能手表是現在很流行的一種智能設備&#xff0c;很多品牌都推出了各種各樣的產品&#xff0c;但是大部分都更側重功能和運動的方面&#xff0c;健康監測往往只是配角&#xff0c;而隨著人們對自己的健康越來越重視&#xff0c;有些朋友只是單純的需要一塊專業的健康監測手表。…

選擇任務管理軟件:哪個更適合你的需求?

隨著互聯網的發展&#xff0c;知識管理是可以成為企業獲得更大發展前景的神兵利器&#xff0c;任務協同&#xff0c;是服務于中小型團隊&#xff0c;或者大型機構的終端組織。來看看這款國外流行的任務管理軟件Zoho Projects。 任務管理是企業協同的重要組成部分。 任務管理是企…

Bitcoin 加速交易操作示例

這里以 Bitcoin Ordinals NFT 為例&#xff0c; 進行加速交易演示 第1步&#xff1a;新建子賬戶 溫馨提示&#xff1a;如果有多條魚未確認&#xff0c;也只需1個賬戶即可&#xff0c;不必搞多個子賬戶 第2步&#xff1a;切換回到老地址&#xff08;Account 1&#xff09; 第3步…

【Kubernetes】Kubernetes的PV和PVC的用法

PV、PVC 前言一、 存儲卷1. emptyDir 存儲卷1.1 概念1.2 實例 2. hostPath 存儲卷2.1 概念2.2 實例 3. nfs共享存儲卷 二、PV 和 PVC1. 概念1.1 PV1.2 PVC1.3 PVC 的使用邏輯1.4 創建機制1.5 PV 和 PVC 的生命力周期1.6 創建及銷毀 PV 的流程 2. PV 和 PVC 的創建2.1 查看定義2…

高并發內存池項目(C++實戰項目)

項目介紹 項目來源 本項目實現了一個高并發內存池&#xff0c;參考了Google的開源項目tcmalloc實現的簡易版&#xff1b;其功能就是實現高效的多線程內存管理。由功能可知&#xff0c;高并發指的是高效的多線程&#xff0c;而內存池則是實現內存管理的。 tcmalloc源碼 項目…

論智能與反智能的對立統一

智能和反智能可以被視為一個相對的概念&#xff0c;彼此存在一定的關聯和互補。在發展智能和反智能技術的過程中&#xff0c;我們必須始終牢記倫理和法律的原則&#xff0c;在合法和道德的框架內進行研究和應用&#xff0c;遵守相關的規定和限制。只有在這樣的前提下&#xff0…