C#8.0本质论第十五章--支持标准查询操作的集合接口

C#8.0本质论第十五章–支持标准查询操作的集合接口

集合在C#3.0中通过称为语言集成查询(Language Integrated Query, LINQ)的一套编程API进行了大刀阔斧的改革。通过一系列扩展方法和Lambda表达式,LINQ提供了一套功能超凡的API来操纵集合。本章重点是标准查询操作符,它通过直接调用扩展方法来发挥Linq的作用。

15.1集合初始化器

集合初始化器(collection initializers)允许采用和数组声明相似的方式,在集合实例化期间用一组初始成员构造该集合。也和对象初始化器的语法相似,都是在构造函数调用的后面添加一对大括号,再在大括号内添加初始化列表。应用集合初始化器的集合类型应实现ICollection< T >接口确保集合包含Add()方法。

public static void Main()
{List<string> sevenWorldBlunders;sevenWorldBlunders = new List<string>(){// Quotes from Gandhi"Wealth without work","Pleasure without conscience","Knowledge without character","Commerce without morality","Science without humanity","Worship without sacrifice","Politics without principle"};Print(sevenWorldBlunders);
}

15.2IEnumerable使类成为集合

"运行时"根本不知foreach为何物。C#编译器会对代码进行必要的转换。

15.2.1foreach之于数组
int[] array = new int[] { 1, 2, 3, 4, 5, 6 };
foreach(int item in array)
{Console.WriteLine(item);
}

C#编译器在生成CIL时,为这段代码创建了一个等价的for循环

int[] tempArray;
int[] array = new int[] { 1, 2, 3, 4, 5, 6 };tempArray = array;
for(int counter = 0; (counter < tempArray.Length); counter++)
{int item = tempArray[counter];Console.WriteLine(item);
}
15.2.2基于IEnumerable遍历集合

迭代器(iterator)模式应运而生。只要能确定第一个和下一个元素,就不需要事先知道元素总数,也不需要按索引获取元素。

while(stack.MoveNext())
{   number = stack.Current();Console.WriteLine(number);
}

上面代码的问题在于,如同时又两个循环交错遍历同一个集合,则集合必须维持当前元素的一个状态指示器,交错的循环可能相互干扰。为解决该问题,集合类不直接支持IEnumerator接口,而是支持IEnumerable接口,唯一的方法就是GetEnumerator()。不是由集合类来维持状态,相反,是由一个不同的类来支持IEnumerator接口,并负责维护循环遍历的状态。

C#编译器不要求一定要实现IEnumerable才能对一个数据类型进行遍历。相反,编译器采用称为"Duck typing"的概念,也就是查找会返回“包含Current属性和MoveNext方法的一个类型“的GetEnumerator()方法。Duck typing按名称查找方法,而不依赖接口或显示方法调用。当Duck typing找不到枚举模式的恰当实现时,编译器才会检查集合是否实现了接口。

15.2.3foerach循环内不要修改

15.3标准查询操作符

IEnumerable上的每个方法都是标准查询操作符,用于为所操作的集合提供查询功能。

15.3.1使用Where()来赛选

获取一个实参并返回Boolean值的委托表达式称为谓词(predicate)。从技术上说,Where()方法的结果是一个对象,它封装了根据一个给定谓词对一个给定序列进行筛选的操作。表达式传给集合,”保存“起来但不马上执行。

15.3.2使用Select()来投射
15.3.3使用Count()对元素进行计数
15.3.4推迟执行
15.3.5使用OrderBy()和ThenBy来排序
15.3.6使用Join()执行内部联结
15.3.7使用GroupJoin实现"一对多"关系
15.3.8调用SelectMany()
15.3.9更多标准查询操作符

15.4匿名类型之于LINQ

C#3.0通过LINQ显著增强了集合处理。其中两处增强是匿名类型和隐式局部遍历。但随着C#7.0元组语法的发布,匿名类终于也要”功成身退“了。如果不用C#7.0或更高版本,仍然可以了解一下匿名类型。

15.4.1匿名类型

匿名类型是编译器声明的数据类型,而不是显示的类定义来声明。

        var patent1 =new{Title = "Bifocals",YearOfPublication = "1784"};var patent2 =new{Title = "Phonograph",YearOfPublication = "1877"};var patent3 =new{patent1.Title,// Renamed to show property namingYear = patent1.YearOfPublication};

匿名类型存粹是一项C#语言功能,不是"运行时"中的新类型。编译器遇到匿名类型时,会自动生成CIL代码,其属性对应于在匿名类型声明中声明的值和数据类型。

15.4.2用LINQ投射成匿名类型
IEnumerable<string> fileList = Directory.EnumerateFiles(rootDirectory, searchPattern);
var items = fileList.Select(file =>{FileInfo fileInfo = new(file);return new{FileName = fileInfo.Name,Size = fileInfo.Length};});
15.4.3匿名类型和隐式局部变量的更多注意事项

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

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

相关文章

sql27(Leetcode1729求关注者的数量)

代码&#xff1a; # Write your MySQL query statement below select user_id,count(follower_id) as followers_count from Followers group by user_id order by user_id

MATLAB程序设计课后作业五

一、改写高斯积分函数 clc;clear;close all; ff(x) x*x*exp(x); s1 GaussL(ff,0,1,2);% 积分点为2点 s2 GaussL(ff,0.5,1,3); % 积分点为3点 disp(s1);disp(s2); function s GaussL(f,a,b,n) % 输入&#xff1a;f为待积分函数的函数句柄&#xff0c;a和b为积分上下限&am…

使用求2个字符串最长公共子序列的方法来实现 git diff 算法 java 实现

测试类 GitDiffTest2.java&#xff1a; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.List;public class GitDiffTest2 {private static String folder "\\xxx\\";private static List<String>…

19.C++ 中将一维数组转成多维的三种方式

文章目录 使用reinterpret_cast强制类型转换使用static_cast 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 使用reinterpret_cast reinterpret_cast作用为&#xff1a;允许将任何指针转换为任何其他指针类型。 #include <iostream&…

CC2530basic_Rf串口无线收发

1初始化板 2定义无线并初始化 3接收数据发送数据 #include "hal_defs.h" #include "hal_cc8051.h" #include "hal_int.h" #include "hal_mcu.h" #include "hal_board.h" #include "hal_led.h" #include "…

Vue3为什么会推出组合式API

前言 大学前端入门学的vue2&#xff0c;工作了又用的React&#xff0c;现在想学习一下Vue3&#xff0c;开篇就介绍了组合式API&#xff0c;这和我认知里的vue2的选项式API区别还是蛮大的。本篇文章简单介绍一下组合式API。 什么是组合式API Vue 3引入了一种新的 API&#xf…

计算函数的变分是什么意思

计算函数的变分是指在变分法中寻找函数的极值。变分法是一种数学方法&#xff0c;用于求解函数或泛函的极值问题。在物理学、工程学和数学的最优化问题中&#xff0c;变分法是寻找函数使得某个泛函&#xff08;函数的函数&#xff09;达到极值的过程。 在数学上&#xff0c;泛…

vue+less+style-resources-loader 配置全局颜色变量

全局统一样式后&#xff0c;可配置vue.config.js实现全局颜色变量&#xff0c;方便在编写时使用统一风格的色彩 一、新建global.less 二、下载安装style-resources-loader npm i style-resources-loader --save-dev三、在vue.config.js中进行配置 module.exports {pluginOpt…

Python Locals:引领代码风潮,变量管理新尝试

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;locals()函数是一个强大的工具&#xff0c;它使程序员能够访问和操作当前作用域内的局部变量。本文将深入探讨locals()函数的功能、应用和重要性。 动态变量赋值和操作 locals()函数让我…

程序员の养生之道

作为一个程序员&#xff0c;养生确实很重要&#xff0c;因为长时间的工作可能导致身体和心理的不适。以下是一些建议&#xff0c;可以帮助程序员保持健康和延寿&#xff1a; 合理的作息时间&#xff1a; 尽量保持规律的作息时间&#xff0c;保证充足的睡眠。规律的作息可以帮助…

算法通关村第七关—理解二叉树的遍历(白银)

深入理解前中后序遍历 给定一棵二叉树 二叉树前序遍历 public void preorder(TreeNode root,List<Integer>res){if&#xff08;rootnull){return;}res.add(root.val);preorder(root.left,res);preorder(root.right,res); }递归的过程如下图所示 从图中可以看到&#x…

JavaScript编程基础 – For循环

JavaScript编程基础 – For循环 JavaScript Programming Essentials – For Loop By JacksonML 循环可以多次执行代码块&#xff0c;而不用反复重写相同的语句。这无疑对提升代码质量、减少错误大有脾益。本文将简要介绍for循环的几种案例&#xff0c;希望对读者有所帮助。 …

Ubuntu 安装adb

安装adb驱动到ubuntu系统下&#xff1a; 1、更新一遍软件源&#xff1a; sudo apt-get update 2、安装adb工具&#xff1a; sudo apt-get install android-tools-adb 3、检查安装是否成功&#xff1a; adb version 4、列出当前的adb设备 sudo adb devices

【Python篇】文件概述 | 读文件 | 写文件 | 追加文件操作

文章目录 &#x1f339;什么是文件&#x1f6f8;读 操作 — r⭐打开文件⭐读取文件&#x1f388;循环读取&#x1f388;读取文件中某一个词语的个数 ⭐关闭文件 &#x1f33a;小结&#x1f6f8;写 操作 — w&#x1f6f8;追加 操作 — a &#x1f339;什么是文件 文件是计算机…

『亚马逊云科技产品测评』活动征文|基于亚马逊云EC2搭建OA系统

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马…

2023年AI报告:首个投研GPTs测评重塑AI竞争格局

今天分享的是AI系列深度研究报告&#xff1a;《2023年AI报告&#xff1a;首个投研GPTs测评重塑AI竞争格局》。 &#xff08;报告出品方&#xff1a;国盛证券&#xff09; 报告共计&#xff1a;10页 1.一键创建 GPTs 助力行业研究 GPTs 目前仅对企业用户和 ChatGPT Plus 会员…

右值引用和移动语句(C++11)

左值引用和右值引用 回顾引用 我们之前就了解到了左值引用&#xff0c;首先我们要了解引用在编译器底层其实就是指针。具体来说&#xff0c;当声明引用时&#xff0c;编译器会在底层生成一个指针来表示引用&#xff0c;但在代码编写和使用时&#xff0c;我们可以像使用变量类…

HarmonyOS系统和Android系统有什么区别?

鸿蒙系统和安卓系统有如下几点区别&#xff1a;点击这里查看获取鸿蒙系统资料方式 (qq.com) 一、开发商不同&#xff1a; 鸿蒙OS&#xff1a;由中国华为公司主导开发的系统&#xff0c;2019年首次发布&#xff0c;现在已经更新至鸿蒙OS4.0。 安卓系统&#xff1a;是由安迪鲁宾…

visual Studio MFC 平台实现图像增强中的线性变换(负变换)和非线性变换(对数与幂律)

MFC 实现数字图像处理中的图像增强操作 本文使用visual Studio MFC 平台实现图像增强中典型的三种图像增强的方法中的两大类&#xff0c;包括线性变换–>负变换&#xff0c;非线性变换–>对数变换和幂律变换&#xff1b;其中第三大类分段式变换可以参考MFC实现图像增强–…

Android Termux 安装Kali Linux 或 kali Nethunter史诗级详细教程

Android Termux 安装Kali Linux 或 kali Nethunter史诗级详细教程 一、Termux配置1、下载安装2、配置存储和换源3、基本工具安装 二、Kali Linux安装1、下载安装脚本2、更换apt源3、图形化安装 三、Kali Nethunter安装1、下载安装脚本2、更换apt源3、图形化连接 四、报错汇总1、…