C#进阶高级语法之LINQ

🐳简介

LINQ是C#编程语言中的一项强大功能,它通过将查询直接集成到编程语言中,大幅度简化了数据查询的代码编写工作。

LINQ的应用场景:

  • 数据源支持:LINQ可查询的数据源类型极为广泛,包括SQL Server数据库、XML文档、ADO.NET数据集以及任何支持IEnumerable接口的对象集合。
  • 查询表达式:使用LINQ查询表达式,可以对数据源执行复杂的筛选、排序和投影操作。例如,从数据库中检索特定条件的数据记录,或从XML文档中提取符合特定规则的节点。

🐳扩展方法

LINQ中的扩展方法提供了一种声明性的数据查询和操作方式,使得在C#中对集合的操作更为方便和高效。以下是一些常用的LINQ扩展方法:

Where - 这个方法用于过滤出集合中满足指定条件的元素

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };  
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList(); // { 2, 4 }

Select - 选择集合中的元素,并可能进行转换

List<string> words = new List<string> { "apple", "banana", "cherry" };  
var wordLengths = words.Select(w => w.Length).ToList(); // { 5, 6, 6 }

SelectMany - 将多个集合合并为一个集合

List<string[]> wordGroups = new List<string[]> { new string[] { "apple", "banana" }, new string[] { "cherry", "date" } };  
var flattened = wordGroups.SelectMany(group => group).ToList(); // { "apple", "banana", "cherry", "date" }

OrderBy 和 ThenBy - 对集合进行排序

List<string> fruits = new List<string> { "banana", "apple", "cherry" };  
var sortedFruits = fruits.OrderBy(f => f).ToList(); // { "apple", "banana", "cherry" }  
// 使用 ThenBy 进行多级排序  
var sortedFruitsByLength = fruits.OrderBy(f => f.Length).ThenBy(f => f).ToList(); // { "apple", "cherry", "banana" }

Any - 检查集合中是否有满足条件的元素

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };  
bool hasEvenNumber = numbers.Any(n => n % 2 == 0); // true

All - 检查集合中所有元素是否都满足条件

List<int> numbers = new List<int> { 2, 4, 6, 8, 10 };  
bool areAllEven = numbers.All(n => n % 2 == 0); // true

Count - 计算集合中满足条件的元素的数量

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };  
int evenCount = numbers.Count(n => n % 2 == 0); // 2

First 和 FirstOrDefault - 获取集合中的第一个元素,或第一个满足条件的元素;如果没有找到,则First会抛出异常,而FirstOrDefault会返回默认值

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };  
int firstEven = numbers.FirstOrDefault(n => n % 2 == 0); // 2

GroupBy - 根据某个键对集合中的元素进行分组

List<string> fruits = new List<string> { "apple", "banana", "cherry", "date", "elderberry" };  
var groupedByFirstLetter = fruits.GroupBy(f => f[0]).ToList(); // 按首字母分组

Take 和 Skip - 分别用于从集合的开始处获取一定数量的元素,或跳过一定数量的元素

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };  
var firstThree = numbers.Take(3).ToList(); // { 1, 2, 3 }  
var lastTwo = numbers.Skip(3).ToList(); // { 4, 5 }

Distinct - 去除集合中的重复元素

List<int> numbers = new List<int> { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4 };  
var uniqueNumbers

Single - 用于从集合中返回唯一的元素。如果集合中不包含任何元素或包含多个元素,该方法将抛出异常。与 First 和 Last 方法不同,Single 要求集合中必须只有一个元素。First 和 Last 分别返回集合中的第一个和最后一个元素,而不管集合中有多少元素。

List<int> numbers = new List<int> { 5 };  
int uniqueNumber = numbers.Single(); // 返回 5,因为集合中只有一个元素  // 如果使用带条件的 Single  
List<int> numbersWithCondition = new List<int> { 1, 2, 3, 4, 5, 5, 6 };  
int uniqueOddNumber = numbersWithCondition.Single(n => n % 2 != 0); 
// 这将抛出异常,因为存在多个奇数

Max - 返回集合中的最大值。

int[] intNumbers = new int[] { 1, 4, 3, 4 };  
int intMax = intNumbers.Max(); // 返回 4

Min - 返回集合中的最小值。

float[] floatNumbers = new float[] { 1.0f, 3.0f, 6.0f };  
float floatMin = floatNumbers.Min(); // 返回 1.0

Sum - 计算集合中所有元素的和。

int[] numbers = { 5, 4, 1, 3, 0 };  
double sum = numbers.Sum(); // 计算结果为 13

Average - 计算集合中所有元素的平均值。

List<int> grades = new List<int> { 78, 92, 100, 37, 81 };  
double average = grades.Average(); 计算结果为 77.5999

🐳集合转换

简单类型转换

假设你有一个int类型的集合,你想要将其转换为double类型的集合

int[] intNumbers = { 1, 2, 3, 4, 5 };  
double[] doubleNumbers = intNumbers.Select(i => (double)i).ToArray();

ToArray() - 整数集合(IEnumerable<int>),转换为一个整数数组(int[]

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };  // 使用LINQ的ToArray方法将List<int>转换为int[]  
int[] numbersArray = numbers.ToArray();  

ToList() - 整数序列(IEnumerable<int>),转换为一个列表(List<int>

 IEnumerable<int> query = Enumerable.Range(1, 5); // 生成1到5的整数序列  // 使用LINQ的ToList方法将IEnumerable<int>转换为List<int>  
List<int> numbersList = query.ToList();  

🐳链式编程

在LINQ(Language Integrated Query)中,链式编程(也称为方法链或流畅接口)是一种常见的编程模式,它允许你通过一系列的方法调用将多个操作链接在一起,从而以流畅的方式构建和执行查询。链式编程通过返回查询本身(或至少是一个支持后续操作的类型)的每个方法调用来实现。

以下是一个使用LINQ链式编程的示例,它从一个整数列表中筛选出偶数,并将这些偶数乘以2,最后将这些结果转换为数组:

 List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };  // 使用LINQ链式编程来筛选偶数,乘以2,并转换为数组  int[] evenNumbersDoubled = numbers  .Where(n => n % 2 == 0) // 筛选偶数  .Select(n => n * 2)     // 将偶数乘以2  .ToArray();             // 将结果转换为数组  

🐳总结

LINQ的引入大大提高了数据处理的效率和灵活性。然而,就像任何技术一样,LINQ也有其优点和缺点。

优点:

  1. 统一的数据访问模型:LINQ为不同的数据源提供了一个统一的查询语法,使得开发人员可以使用相同的技术来查询和操作各种类型的数据,无论是内存中的集合、数据库、XML文档还是其他数据源。

  2. 类型安全:LINQ查询在编译时进行类型检查,这有助于减少运行时错误。开发人员可以清楚地知道他们正在查询的数据类型,并据此编写更健壮的代码。

  3. 可读性:LINQ查询语法直观易懂,尤其是对于那些熟悉SQL的开发人员来说。查询可以像编写普通代码一样编写和调试,这提高了代码的可读性和可维护性。

  4. 强大的查询功能:LINQ提供了丰富的查询操作符,如筛选、排序、分组、聚合等,使得开发人员可以轻松地构建复杂的查询。此外,LINQ还支持Lambda表达式和匿名类型,进一步增强了查询的灵活性和功能。

  5. 延迟执行:LINQ查询在默认情况下是延迟执行的,这意味着查询本身不会立即执行,而是在需要结果时(如调用ToList()ToArray()等方法时)才执行。这种延迟执行机制有助于提高查询的性能和效率。

缺点:

  1. 性能开销:虽然LINQ查询在大多数情况下都能提供很好的性能,但在某些情况下,使用LINQ可能会导致额外的性能开销。例如,当处理大量数据时,LINQ查询可能会比传统的循环遍历慢一些。此外,LINQ查询在编译时需要生成额外的代码和元数据,这也会增加一些性能开销。

  2. 学习曲线:虽然LINQ查询语法直观易懂,但对于初学者来说,学习如何有效地使用LINQ可能需要一些时间和实践。特别是对于那些没有SQL经验的开发人员来说,可能需要一些时间来适应和理解LINQ的查询概念。

  3. 限制:尽管LINQ非常强大和灵活,但它也有一些限制。例如,某些复杂的查询或操作可能无法使用LINQ来表达,或者需要使用更复杂的技术来实现。此外,LINQ查询的结果通常是强类型的,这可能导致在某些情况下需要额外的类型转换或处理。

  4. 与现有技术的集成:在某些情况下,可能需要将LINQ与其他技术(如ORM框架、数据库访问技术等)集成使用。这可能会增加代码的复杂性,并需要额外的配置和调试工作。

  5. 调试困难:虽然LINQ查询在大多数情况下都可以正常工作,但在某些复杂的查询中,可能会出现难以调试的问题。这可能是因为查询的复杂性、延迟执行机制或与其他技术的集成问题等原因导致的。

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

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

相关文章

插卡式仪器模块:示波器模块(插卡式)

• 12 位分辨率 • 125 MSPS 采样率 • 支持单通道/双通道模块选择 • 可实现信号分析 • 上电时序测量 • 抓取并分析波形的周期、幅值、异常信号等指标 • 电源纹波与噪声分析 • 信号模板比对 • 无线充电&#xff08;信号解调&#xff09; 通道12输入阻抗Hi-Z, 1 MΩ…

检索增强生成RAG需要用到的10个资源、工具和Python库

●10个资源和工具 在机器学习和自然语言处理领域&#xff0c;有多种工具和框架可用于实现和使用检索增强型生成&#xff08;RAG&#xff09;模型。以下是一些关键的资源和工具&#xff1a; Hugging Face Transformers&#xff1a; Hugging Face在其广泛使用的Transformers库…

CountDownLatch闭锁

Java并发库提供了CountDownLatch类来实现这个功能。 CountDownLatch类是一个同步工具类&#xff0c;在完成某些运算时&#xff0c;只有其他所有的运算全部完成&#xff0c;当前运算才继续执行。 下面是一个案例来说明CountDownLatch&#xff1a; 说明&#xff1a;当前有 5 个…

matlab使用教程(95)—显示地理数据

下面的示例说明了多种表示地球地貌的方法。此示例中的数据取自美国商务部海洋及大气管理局 (NOAA) 国家地理数据中心&#xff0c;数据通告编号为 88-MGG-02。 1.关于地貌数据 数据文件 topo.mat 包含地貌数据。topo 是海拔数据&#xff0c;topomap1 是海拔的颜色图。 load t…

java-ArrayList的底层原理

Java中的ArrayList是基于数组实现的动态数组&#xff0c;它提供了比标准数组更多的灵活性&#xff0c;特别是在大小方面。ArrayList的底层原理主要依赖于以下几个关键点&#xff1a; 1. 数组&#xff1a;ArrayList内部维护了一个数组&#xff0c;这个数组用于存储集合中的元素。…

nodejs 中 axios 设置 burp 抓取 http 与 https

在使用 axios 库的时候&#xff0c;希望用 burp 抓包查看发包内容。但关于 axios 设置代理问题&#xff0c;网上提到的一些方法不是好用&#xff0c;摸索了一段时间后总结出设置 burp 代理抓包的方法。 nodejs 中 axios 设置 burp 抓包 根据请求的站点&#xff0c;分为 http …

web前端:作业二

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 1.将ul的子l…

Java加密体系结构参考指南-Java Cryptography Architecture

本文是从英文的官网摘了翻译的&#xff0c;用作自己的整理和记录。水平有限&#xff0c;欢迎指正。版本是&#xff1a;22 原文地址&#xff1a;https://docs.oracle.com/en/java/javase/22/security/java-cryptography-architecture-jca-reference-guide.html#GUID-815542FE-CF…

JavaScript学习|JavaScript 引入方式、JavaScript 基础语法、JavaScript 对象、BOM、DOM、事件监听、事件绑定

JavaScript 能做什么 1.能够改变文本内容 2.能够改变图像的src属性值 3.能够进行表单验证等 JavaScript 引入方式 内部脚本 1.内部脚本:将 JS代码定义在HTML页面中&#xff0c;JavaScript代码必须位于<script>与</script>标签之间。在 HTML 文档中可以在任意地…

C/C++学习笔记 C语言中的\0以及查找字符串中字符出现的频率

在此示例中&#xff0c;计算了字符串对象中字符的频率。 为此&#xff0c;使用size()函数查找字符串对象的长度。然后for 循环迭代直到字符串末尾。 在每次迭代中&#xff0c;检查字符是否出现&#xff0c;如果发现&#xff0c;则计数增加 1。 示例 1 #include <iostream&g…

在 Visual Studio 调试器中指定符号 (.pdb) 和源文件

程序数据库 (.pdb) 文件(也称为符号文件)将你在类、方法和其他代码的源文件中创建的标识符映射到在项目的已编译可执行文件中使用的标识符。 .pdb 文件还可以将源代码中的语句映射到可执行文件中的执行指令。 调试器使用此信息确定两个关键信息:显示在 Visual Studio IDE 中…

算法训练营day51

题目1&#xff1a;121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; 要搞明白dp数组的含义&#xff0c; dp数组包含两种情况&#xff0c;持有股票&#xff0c;这个可以持有之前的也可以持有今天的&#xff1b;不持有股票&#xff0c;可以是之前就不持有&#…

家庭电脑私网如何访问阿里云服务器的指定端口

这里我们以在阿里云服务器上部署一个redis server 服务&#xff0c;对外开放6379端口为例子&#xff0c;其他端口类似。 1.获取当前电脑主机对应的公网IP, 可以https://tool.lu/ip/通过这个网站拿到。 2.阿里云服务器控制台设置防火墙&#xff0c;如下图所示&#xff0c;直接添…

Llama模型家族之Stanford NLP ReFT源代码探索 (三)reft_model.py代码解析

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

RapidMiner数据挖掘4 —— 决策树

0. 序章 0.1 文本说明 所有应用程序操作的名称和编程说明都以黄色背景书写&#xff0c;问题以蓝色背景书写&#xff0c;以方便他们在文本中识别。 在整个课程中&#xff0c;请逐步遵循所有说明&#xff0c;并确保获得预期结果&#xff0c;然后再继续下一部分或问题。 通过在Ub…

渗透测试之内核安全系列课程:Rootkit技术初探(四)

今天&#xff0c;我们来讲一下内核安全&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 目前&#xff0c;在渗透测试领域&#xff0c;主要分为了两个发展方向&#xff0c;分别为Web攻防领域和PWN&#xff08;二进制安全&#xff09;攻防领域。在…

汽车网络安全深入分析

汽车网络安全的重要性及背景 随着科技的飞速发展,汽车行业正经历着一场深刻的变革。汽车不再仅仅是一种交通工具,而逐渐演变成了一个具备高度智能化和互联化的复杂系统。在这个过程中,汽车网络安全的重要性日益凸显。 汽车网络安全的重要意义不言而喻。首先,它关乎到用户的…

python列表---基本语法(浅拷贝,深拷贝等)

文章目录 引言:列表的注意事项1 list中的浅拷贝与深拷贝1.1浅拷贝(Shallow Copy)浅拷贝的方法浅拷贝的效果1.2深拷贝(Deep Copy)深拷贝的方法深拷贝的效果1.3 总结:浅拷贝 vs 深拷贝1.4 为什么浅拷贝顶层元素如果是不可变数据就不能共享,不是传的是引用就相当于传的是地…

⌈ 传知代码 ⌋ 以思维链为线索推理隐含情感

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

速览三版HTTP的改进策略

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是互联网通信的基础协议&#xff0c;自从其第一个版本推出以来&#xff0c;经历了多个版本的改进&#xff0c;每个版本都针对之前的不足进行了优化和增强。以下是HTTP/1.1、HTTP/2和HTTP/3的主要改进总结&#xff1a; …