windows C#-编写 C# LINQ 查询(上)

介绍性的语言集成查询 (LINQ) 文档中的大多数查询是使用 LINQ 声明性查询语法编写的。 但是在编译代码时,查询语法必须转换为针对 .NET 公共语言运行时 (CLR) 的方法调用。 这些方法调用会调用标准查询运算符(名称为 Where、Select、GroupBy、Join、Max 和 Average 等)。 可以使用方法语法(而不查询语法)来直接调用它们。

查询语法和方法语法在语义上是相同的,但是查询语法通常更简单且更易于阅读。 某些查询必须表示为方法调用。 例如,必须使用方法调用表示检索与指定条件匹配的元素数的查询。 还必须对检索源序列中具有最大值的元素的查询使用方法调用。 System.Linq 命名空间中的标准查询运算符的参考文档通常使用方法语法。 你应该熟悉如何在查询和查询表达式本身中使用方法语法。

标准查询运算符扩展方法

下面的示例演示一个简单查询表达式以及编写为基于方法的查询的语义上等效的查询。

int[] numbers = [ 5, 10, 8, 3, 6, 12 ];//Query syntax:
IEnumerable<int> numQuery1 =from num in numberswhere num % 2 == 0orderby numselect num;//Method syntax:
IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);foreach (int i in numQuery1)
{Console.Write(i + " ");
}
Console.WriteLine(System.Environment.NewLine);
foreach (int i in numQuery2)
{Console.Write(i + " ");
}

这两个示例的输出是相同的。 可以看到查询变量的类型在两种形式中是相同的:IEnumerable<T>。

为了了解基于方法的查询,我们来仔细讨论它。 在表达式右侧,请注意,where 子句现在表示为 numbers 对象上的实例方法,它具有类型 IEnumerable<int>。 如果熟悉泛型 IEnumerable<T> 接口,则会知道它没有 Where 方法。 但是,如果在 Visual Studio IDE 中调用 IntelliSense 完成列表,则不仅会看到 Where 方法,还会看到许多其他方法(如 Select、SelectMany、Join 和 Orderby)。 这些方法实现标准查询运算符。

虽然看起来好像 IEnumerable<T> 包括其他方法,但它没有。 标准查询运算符作为扩展方法来实现。 扩展方法可“扩展”现有类型;它们可以如同类型上的实例方法一样进行调用。 标准查询运算符扩展了 IEnumerable<T>,因此可以写入 numbers.Where(...)。

若要使用扩展方法,请使用 using 指令将它们引入范围。 从应用程序的角度来看,扩展方法与常规实例方法是相同的。

某些 LINQ 提供程序(如 实体框架和 LINQ to XML),会实现自己的标准查询运算符,并为 IEnumerable<T> 之外的其他类型实现扩展方法。

Lambda 表达式

在上面的示例中,请注意,条件表达式 (num % 2 == 0) 作为内联参数传递给 Enumerable.Where 方法:Where(num => num % 2 == 0). 此内联表达式为 lambda 表达式。 编写代码是一种方便的方法,否则必须以更繁琐的形式编写代码。 运算符左侧的 num 是输入变量,它与查询表达式中的 num 对应。 编译器可以推断出 num 的类型,因为它知道 numbers 是泛型 IEnumerable<T> 类型。 Lambda 的主体与查询语法中或任何其他 C# 表达式或语句中的表达式完全相同。 它可以包含方法调用和其他复杂逻辑。 返回值就是表达式结果。 某些查询只能采用方法语法进行表示,而其中一些查询需要 lambda 表达式。 Lambda 表达式是 LINQ 工具箱中的一个强大且灵活的工具。

查询的可组合性

在前面的代码示例中,Enumerable.OrderBy 方法通过对 Where 调用使用点运算符来调用。 Where 生成筛选序列,然后 Orderby 对 Where 所生成的序列进行排序。 由于查询返回 IEnumerable,因此可通过将方法调用链接在一起在方法语法中撰写查询。 使用查询语法编写查询时,编译器会执行此组合。 因为查询变量不存储查询的结果,所以可以随时修改它或将它用作新查询的基础(即使在执行它之后)。

下面的示例演示使用前面列出的每种方法的一些简单 LINQ 查询。

示例 - 查询语法

使用查询语法编写大多数查询来创建查询表达式。 下面的示例演示三个查询表达式。 第一个查询表达式演示如何通过应用包含 where 子句的条件来筛选或限制结果。 它返回源序列中值大于 7 或小于 3 的所有元素。 第二个表达式演示如何对返回的结果进行排序。 第三个表达式演示如何根据某个键对结果进行分组。 此查询基于单词的第一个字母返回两个组。

List<int> numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0];// The query variables can also be implicitly typed by using var// Query #1.
IEnumerable<int> filteringQuery =from num in numberswhere num is < 3 or > 7select num;// Query #2.
IEnumerable<int> orderingQuery =from num in numberswhere num is < 3 or > 7orderby num ascendingselect num;// Query #3.
string[] groupingQuery = ["carrots", "cabbage", "broccoli", "beans", "barley"];
IEnumerable<IGrouping<char, string>> queryFoodGroups =from item in groupingQuerygroup item by item[0];

查询的类型为 IEnumerable<T>。 可以使用 var 编写所有这些查询,如下面的示例所示:

var query = from num in numbers...

在前面的每个示例中,在 foreach 语句或其他语句中循环访问查询变量之前,查询不会实际执行。

示例 - 方法语法

某些查询操作必须表示为方法调用。 最常见的此类方法是可返回单一数值的方法,例如 Sum、Max、Min、Average 等。 这些方法在任何查询中都必须始终最后一个调用,因为它们返回单个值,不能用作额外查询操作的源。 下面的示例演示查询表达式中的方法调用:

List<int> numbers1 = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0];
List<int> numbers2 = [15, 14, 11, 13, 19, 18, 16, 17, 12, 10];// Query #4.
double average = numbers1.Average();// Query #5.
IEnumerable<int> concatenationQuery = numbers1.Concat(numbers2);

如果方法具有 System.Action 或 System.Func<TResult> 参数,则这些参数以 lambda 表达式的形式提供,如下面的示例所示:

// Query #6.
IEnumerable<int> largeNumbersQuery = numbers2.Where(c => c > 15);

在前面的查询中,只有查询 #4 立即执行,因为它返回单个值,而不是泛型 IEnumerable<T> 集合。 方法本身使用 foreach 或类似的代码来计算其值。

上面的每个查询可以通过 var 使用隐式类型化进行编写,如下面的示例所示:

// var is used for convenience in these queries
double average = numbers1.Average();
var concatenationQuery = numbers1.Concat(numbers2);
var largeNumbersQuery = numbers2.Where(c => c > 15);
示例 - 混合查询和方法语法

此示例演示如何对查询子句的结果使用方法语法。 只需将查询表达式括在括号中,然后应用点运算符并调用方法。 在下面的示例中,查询 #7 返回对值介于 3 与 7 之间的数字进行的计数。 但是通常情况下,最好使用另一个变量存储方法调用的结果。 采用此方法时,查询不太可能与查询的结果相混淆。

// Query #7.// Using a query expression with method syntax
var numCount1 = (from num in numbers1where num is > 3 and < 7select num
).Count();// Better: Create a new variable to store
// the method call result
IEnumerable<int> numbersQuery =from num in numbers1where num is > 3 and < 7select num;var numCount2 = numbersQuery.Count();

由于查询 #7 返回单个值而不是集合,因此查询立即执行。

// 前面的查询可以通过 var 使用隐式类型化进行编写,如下所示:
var numCount = (from num in numbers...// 它可以采用方法语法进行编写,如下所示:
var numCount = numbers.Count(n => n is > 3 and < 7);//它可以使用显式类型化进行编写,如下所示:
int numCount = numbers.Count(n => n is > 3 and < 7);

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

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

相关文章

c++入门->类的定义以及this详细解析

1.对象的定义 可以在内部定义变量还有函数&#xff0c;而其中的public是声明这里面的东西是共有的&#xff0c;可以调用也可以修改&#xff0c;但是private则是声明这里面的东西是私有的不可以被改变的&#xff0c;但是在类里面共有的是可以使用私有的。 在对象中默认都是私有…

SAP- 不写代码创建报表

创建报表 点击报保存&#xff0c;表Z0708创建完成 关联三张数据库底表 点击返回 点击报保存&#xff0c;表Z0708创建完成 创建报表

从PE结构到LoadLibrary

从PE结构到LoadLibrary PE是Windows平台主流可执行文件格式,.exe , .dll, .sys, .com文件都是PE格式 32位的PE文件称为PE32&#xff0c;64位的称为PE32&#xff0c;PE文件格式在winnt.h头中有着详细的定义&#xff0c;PE文件头包含了一个程序在运行时需要的所有信息&#xff…

聚类分析 | MSADBO优化Spectral谱聚类优化算法

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于改进正弦算法引导的蜣螂优化算法(MSADBO)优化Spectral谱聚类&#xff0c;matlab代码&#xff0c;直接运行! 创新独家&#xff0c;先用先发&#xff0c;注释清晰&#xff0c;送MSADBO参考文献!优化参数 优化后的带…

【C++】构造与析构函数

目录&#xff1a; 一、 This指针  &#xff08;一&#xff09;使用方法&#xff1a; 二、类的默认成员函数 三、构造函数  &#xff08;一&#xff09;构造函数的特点 四、析构函数 &#xff08;一&#xff09;析构函数的特点 正文 一、 This指针 在c语言中我们调用函…

2021TCSVT,VDM-DA:面向无源数据域自适应的虚拟域建模

原文标题&#xff1a;VDM-DA: Virtual Domain Modeling for Source Data-free Domain Adaptation 中文标题&#xff1a;VDM-DA&#xff1a;面向无源数据域自适应的虚拟域建模 1、Abstract 领域适应旨在利用标签丰富的领域&#xff08;源领域&#xff09;来帮助标签稀缺领域&…

MySQL数据库1——数据库概论

一.数据库概论 1.数据库 数据库&#xff08;DataBase&#xff0c;DB&#xff09;&#xff1a;是长期存储在计算机内、有组织的、统一管理的相关数据的集合。简单来说&#xff0c;它就是一个存储各种数据的仓库&#xff0c;且存储过程不是随便而是有组织的。 数据库管理系统&am…

英伟达Tensor Core技术架构原理分析

英伟达Tensor Core架构技术原理 英伟达的Tensor Core架构是一种专为加速人工智能、深度学习、高性能计算(HPC)等领域中的矩阵运算和张量运算而设计的硬件单元。自首次在Volta架构中引入以来&#xff0c;Tensor Cores已成为NVIDIA高端GPU的核心特性&#xff0c;并在后续的Turing…

Linux基础5-进程控制1(fork创建子进程,写时拷贝,进程退出)

上篇文章&#xff1a;Linux基础4-进程5&#xff08;程序地址空间详解&#xff09;-CSDN博客 本篇重点&#xff1a;fork&#xff0c;写实拷贝&#xff0c;进程退出 目录 一. fork创建子进程 1.1 fork用法 1.2 fork返回值有两个的理解 二. 进程退出码 2.1 进程退出码 2.2 进…

用python中的tkinter包实现进度条

python中的tkinter包是一种常见的设计程序的GUI界面用的包。本文主要介绍这里面的一个组件&#xff1a;进度条&#xff08;Progressbar&#xff09;。Tkinter Progressbar里面对进度条组件已经做了一定的介绍&#xff0c;但比较抽象。本文以另一种方式介绍这个组件及其常用用法…

20.使用标准差剔除异常值

标准差剔除异常值 1. 方法2. 示例代码2.1 数据读取与清洗2.2 分段读取数据并绘图2.3 解释2.4 outliers2.5 结果展示 我有个记录数据采集后格式是step_rewards.txt 的文档&#xff0c;里面只有一列数据&#xff0c;10*10000行数据&#xff0c;没有表头&#xff0c;分别代表奖励数…

中科蓝讯修改蓝牙名字:【图文讲解】

本文以市面上一款公板公模的畅销产品为例。K12蓝牙音响。 音响用的芯片是&#xff1a;AB5768E MIC用的芯片是&#xff1a;AB5769A 硬件框架图如下&#xff1a; 芯片修改名字&#xff0c;通过下载工具中的配置进行修改。选择蓝牙配置&#xff0c;然后会出现蓝牙名字&#xff…

旅行包发霉怎么处理 除霉及防霉解决方法

近些年听到很多箱包工厂的心声&#xff0c;为什么箱包旅行包每年都会出现长霉请况呢&#xff1f;长霉了&#xff0c;也就是长毛了&#xff0c;长出那些病菌、真菌、细菌等微生物。经ihaoer防霉人士介绍旅行包长霉处理方法如下&#xff1a; 旅行包长霉的因素 一、旅行包储存在阴…

14、交互补充

1、元素的三大系列 1.1、offset系列 1.1.1、offset初相识 使用offset系列相关属性可以动态的得到该元素的位置&#xff08;偏移&#xff09;、大小等 获得元素距离带有定位祖先元素的位置获得元素自身的大小&#xff08;宽度高度&#xff09;注意&#xff1a;返回的数值都不…

【IEEE出版、八大高校联合举办、稳定EI检索】第四届人工智能与智能制造国际研讨会(AIIM 2024,12月20-22日)

第四届人工智能与智能制造国际研讨会&#xff08;AIIM 2024&#xff09; The 4th International Symposium on Artificial Intelligence and Intelligent Manufacturing 2024年12月20-22日 中国成都 重要信息 大会官网&#xff1a;www.isaiim.com 大会时间&#xff1a;202…

朴素贝叶斯算法探讨与实践

引言 和撰写博文[1]的缘由一样&#xff0c;本文是想要在所创设的专栏[2]里把所谓的十大机器学习算法[3]全部过一遍。 朴素贝叶斯算法是传统机器学习里的一种可以被用来进行分类的算法&#xff0c;本文将对其原理进行说明&#xff0c;并基于原理给出一个基于该算法的分类实践。…

《数据在内存中的存储》

内存函数 1. 整数在内存中的存储 &#xff08;1&#xff09;旧识回顾&#xff1a; 之前在学到操作符的时候&#xff0c;我们就学过了下面的内容&#xff1a; 整数的二进制的表示方式有三种&#xff0c;原码、反码、补码 有符号的整数&#xff0c;三种表示方式均有符号位和数…

【路径规划】粒子群算法、遗传算法、差分进化算法、灰狼优化算法、麻雀优化算法(PSO、GA、DE、GWO、SSA)路径规划

摘要 本文探讨了多种智能优化算法在路径规划中的应用&#xff0c;包括粒子群算法&#xff08;PSO&#xff09;、遗传算法&#xff08;GA&#xff09;、差分进化算法&#xff08;DE&#xff09;、灰狼优化算法&#xff08;GWO&#xff09;和麻雀优化算法&#xff08;SSA&#x…

CSS基础知识05(弹性盒子、布局详解,动画,3D转换,calc)

目录 0、弹性盒子、布局 0.1.弹性盒子的基本概念 0.2.弹性盒子的主轴和交叉轴 0.3.弹性盒子的属性 flex-direction row row-reverse column column-reverse flex-wrap nowrap wrap wrap-reverse flex-dirction和flex-wrap的组合简写模式 justify-content flex-s…

如何搭建一台邮箱服务器,配置满分邮箱

如何搭建一台邮箱服务器,配置满分邮箱 搭建一台个人邮箱服务器听上去非常有技术含量&#xff0c;但只要准备工作充分&#xff0c;并且选择合适的软件&#xff0c;配置满分的邮箱&#xff0c;其实并没有想象中那么困难。在这篇文章中&#xff0c;我们将介绍搭建邮箱服务器的 必备…