C# 中LINQ的详细介绍

文章目录

  • 前言
  • 一、 LINQ 的基本概念
  • 二、查询语法与方法语法
  • 三、LINQ 的投影操作
  • 四、LINQ 的排序操作
  • 五、LINQ 的过滤操作
  • 六、LINQ 的分组操作
  • 七、LINQ 的连接操作
  • 八、LINQ 的聚合操作
  • 九、LINQ 的延迟执行
  • 十、LINQ 的错误处理
  • 十一、LINQ 的合并操作
  • 十二、LINQ 的自定义对象查询
  • 十三、LINQ 的顺序查询
  • 十四、LINQ 的集合操作
  • 十五、LINQ 的数据聚集


前言

  LINQ(语言集成查询)是 C# 中用于从数组、集合、数据库等数据源中进行查询和操作的强大功能。它提供了一种统一的方式来处理各种数据。
在这里插入图片描述

一、 LINQ 的基本概念

  LINQ 是一种编程模式,可以让开发者以一种简洁的方式查询和操作数据。它简化了对数据的查询操作,使得数据操作变得更加直接和清晰。LINQ 可以与多种数据源结合使用,包括对象、数据库、XML 和数据集。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };var query = from n in numberswhere n > 2select n;foreach (var num in query){Console.WriteLine(num); // 输出: 3, 4, 5}}
}

二、查询语法与方法语法

  LINQ 支持两种主要的语法:查询语法和方法语法。查询语法更接近于 SQL,适合用来执行复杂的查询;方法语法基于方法链,更加灵活。两者虽然不同,但可以实现同样的功能。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<string> names = new List<string> { "Alice", "Bob", "Charlie", "Dave" };// 查询语法var querySyntax = from name in nameswhere name.StartsWith("C")select name;// 方法语法var methodSyntax = names.Where(n => n.StartsWith("C"));Console.WriteLine("查询语法:");foreach (var name in querySyntax) Console.WriteLine(name); // 输出: CharlieConsole.WriteLine("方法语法:");foreach (var name in methodSyntax) Console.WriteLine(name); // 输出: Charlie}
}

三、LINQ 的投影操作

  投影操作允许开发者选择特定的数据字段。Select 方法可以用来实现投影操作,将数据转化为新的形态。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;class Program
{public class Person{public string Name { get; set; }public int Age { get; set; }}static void Main(){List<Person> people = new List<Person>{new Person { Name = "Alice", Age = 30 },new Person { Name = "Bob", Age = 25 },new Person { Name = "Charlie", Age = 35 }};var names = people.Select(p => p.Name);foreach (var name in names){Console.WriteLine(name); // 输出: Alice, Bob, Charlie}}
}

四、LINQ 的排序操作

  LINQ 允许按特定条件对数据进行排序,常用方法包括 OrderBy 和 OrderByDescending。这使得对结果进行排序变得非常简单。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;class Program
{public class Product{public string Name { get; set; }public decimal Price { get; set; }}static void Main(){List<Product> products = new List<Product>{new Product { Name = "Laptop", Price = 999.99m },new Product { Name = "Smartphone", Price = 499.99m },new Product { Name = "Tablet", Price = 299.99m }};var sortedProducts = products.OrderBy(p => p.Price);foreach (var product in sortedProducts){Console.WriteLine($"{product.Name}: {product.Price}"); // 按价格输出产品}}
}

五、LINQ 的过滤操作

  使用 Where 方法,开发者可以对数据进行筛选,只返回符合特定条件的元素。这是 LINQ 中最常用的操作之一。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };var evenNumbers = numbers.Where(n => n % 2 == 0);Console.WriteLine("偶数:");foreach (var num in evenNumbers){Console.WriteLine(num); // 输出: 2, 4, 6, 8, 10}}
}

六、LINQ 的分组操作

  GroupBy 方法允许开发者按照某个属性将数据进行分组。通过分组,开发者可以更好地分析和展示数据。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;class Program
{public class Student{public string Name { get; set; }public string Grade { get; set; }}static void Main(){List<Student> students = new List<Student>{new Student { Name = "Alice", Grade = "A" },new Student { Name = "Bob", Grade = "B" },new Student { Name = "Charlie", Grade = "A" },new Student { Name = "David", Grade = "C" }};var groupedStudents = students.GroupBy(s => s.Grade);foreach (var group in groupedStudents){Console.WriteLine($"年级: {group.Key}");foreach (var student in group){Console.WriteLine($" - {student.Name}");}}}
}

七、LINQ 的连接操作

  通过 Join 方法,开发者可以将两个集合连接在一起,以便进行更复杂的数据查询和处理。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;class Program
{public class Student{public int Id { get; set; }public string Name { get; set; }}public class Enrollment{public int StudentId { get; set; }public string Course { get; set; }}static void Main(){List<Student> students = new List<Student>{new Student { Id = 1, Name = "Alice" },new Student { Id = 2, Name = "Bob" }};List<Enrollment> enrollments = new List<Enrollment>{new Enrollment { StudentId = 1, Course = "Math" },new Enrollment { StudentId = 2, Course = "Science" },new Enrollment { StudentId = 1, Course = "Science" }};var studentEnrollments = from student in studentsjoin enrollment in enrollments on student.Id equals enrollment.StudentIdselect new { student.Name, enrollment.Course };foreach (var se in studentEnrollments){Console.WriteLine($"{se.Name} 注册了 {se.Course}");}}
}

八、LINQ 的聚合操作

  LINQ 提供多种聚合操作,这些操作允许开发者对数据进行总结和统计。例如,Count、Sum、Max 和 Average 方法可以帮助计算某些属性的总和或平均值。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };int sum = numbers.Sum();int count = numbers.Count();int max = numbers.Max();double average = numbers.Average();Console.WriteLine($"总和: {sum}, 个数: {count}, 最大值: {max}, 平均值: {average}");}
}

九、LINQ 的延迟执行

  LINQ 查询默认情况下是延迟执行的,这意味着查询并不会在声明时执行,而是在实际迭代结果时才会被执行。这使得 LINQ 更加灵活,且在未被使用时不会消耗资源。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };var query = numbers.Where(n => n > 2);Console.WriteLine("查询尚未执行。");foreach (var num in query){Console.WriteLine(num); // 在此时查询会被执行}}
}

十、LINQ 的错误处理

  编写 LINQ 查询时,可能会遇到异常。有效的错误处理机制是确保应用程序正常运行的关键。可以结合 try-catch 块来捕捉和处理这些异常。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<int> numbers = null; // 模拟空集合try{var query = numbers.Where(n => n > 0);foreach (var num in query){Console.WriteLine(num);}}catch (NullReferenceException ex){Console.WriteLine("错误: " + ex.Message);}}
}

十一、LINQ 的合并操作

  通过 Concat 和 Union 方法,LINQ 允许将多个集合连接在一起。Concat 不会移除重复项,而 Union 会移除重复项。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<int> numbers1 = new List<int> { 1, 2, 3 };List<int> numbers2 = new List<int> { 3, 4, 5 };var concatenated = numbers1.Concat(numbers2);var unioned = numbers1.Union(numbers2);Console.WriteLine("连接结果:");foreach (var num in concatenated){Console.WriteLine(num); // 输出: 1, 2, 3, 3, 4, 5}Console.WriteLine("联合结果:");foreach (var num in unioned){Console.WriteLine(num); // 输出: 1, 2, 3, 4, 5}}
}

十二、LINQ 的自定义对象查询

  LINQ 不只局限于内置的数据类型,也可以查询自定义对象。这为开发者提供了强大的数据操作能力。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;class Program
{public class Book{public string Title { get; set; }public string Author { get; set; }}static void Main(){List<Book> books = new List<Book>{new Book { Title = "C# in Depth", Author = "Jon Skeet" },new Book { Title = "Effective C#", Author = "Bill Wagner" },new Book { Title = "CLR via C#", Author = "Jeffrey Richter" }};var query = from b in bookswhere b.Author.Contains("C#")select b;Console.WriteLine("包含 'C#' 的书籍:");foreach (var book in query){Console.WriteLine(book.Title);}}
}

十三、LINQ 的顺序查询

  LINQ 支持按照多个字段进行排序,可以通过链式调用 OrderBy 和 ThenBy 方法实现。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;class Program
{public class Employee{public string Name { get; set; }public string Department { get; set; }public decimal Salary { get; set; }}static void Main(){List<Employee> employees = new List<Employee>{new Employee { Name = "Alice", Department = "HR", Salary = 70000 },new Employee { Name = "Bob", Department = "IT", Salary = 60000 },new Employee { Name = "Charlie", Department = "HR", Salary = 80000 },new Employee { Name = "David", Department = "IT", Salary = 90000 }};var sortedEmployees = employees.OrderBy(e => e.Department).ThenBy(e => e.Salary);foreach (var emp in sortedEmployees){Console.WriteLine($"{emp.Name} - {emp.Department} - {emp.Salary}");}}
}

十四、LINQ 的集合操作

  LINQ 提供 Any、All、Contains 等方法,用于判断集合中的元素是否满足某个条件。这对于进行集合操作和条件检查非常有用。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };bool anyGreaterThan3 = numbers.Any(n => n > 3);bool allGreaterThan0 = numbers.All(n => n > 0);bool containsTwo = numbers.Contains(2);Console.WriteLine($"有大于3的数: {anyGreaterThan3}");Console.WriteLine($"所有数都大于0: {allGreaterThan0}");Console.WriteLine($"包含2: {containsTwo}");}
}

十五、LINQ 的数据聚集

  LINQ 允许开发者轻松执行复杂的数据聚集操作,如 GroupBy 和 Aggregate 方法。特别是 Aggregate,可用于执行自定义的聚集操作。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };int product = numbers.Aggregate((total, next) => total * next);Console.WriteLine($"所有数的乘积: {product}"); // 输出: 120}
}

在这里插入图片描述

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

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

相关文章

mongo开启慢日志及常用命令行操作、数据备份

mongo开启慢日志及常用命令行操作、数据备份 1.常用命令行操作2.mongo备份3.通过命令临时开启慢日志记录4.通过修改配置开启慢日志记录 1.常用命令行操作 连接命令行 格式&#xff1a;mongo -u用户名 -p密码 --host 主机地址 --port 端口号 库名&#xff1b; 如&#xff1a;连…

lyapunov指数的绘制

有如下方程&#xff1a; %% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)绘制其对应的lyapunov指数。 MATLAB实现方式&#xff1a; clc; clearvars; close all;%% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)%% 代码 N 1000; a (0:0.001:1.4); b 0.3; na length(a…

数字时代的文化宝库:存储技术与精神生活

文章目录 1. 文学经典的数字传承2. 音乐的无限可能3. 影视艺术的数字化存储4. 结语 数字时代的文化宝库&#xff1a;存储技术与精神生活 在数字化的浪潮中&#xff0c;存储技术如同一座桥梁&#xff0c;连接着过去与未来&#xff0c;承载着人类文明的瑰宝。随着存储容量的不断增…

关于csgo游戏搬砖作弊与封禁

关于csgo的游戏作弊与封禁 一.关于作弊 什么叫作弊&#xff1f; 1.换肤&#xff0c;换库存 2.各种参&#xff08;回溯&#xff0c;自瞄&#xff0c;透视&#xff0c;急停&#xff0c;连跳&#xff0c;假身&#xff0c;子弹跟踪等&#xff09; 3.某一部分更改游戏内存&…

Arduino IDE for mac 无法加载界面

打开软件后&#xff0c;无法加载界面的问题 1.手动删除“~/Library/Arduino15”文件夹 2.终端中输入sudo nano /etc/hosts&#xff0c;在里面添加“127.0.0.1 localhost”

Go的Gin比java的Springboot更加的开箱即用?

前言 隔壁组的云计算零零后女同事&#xff0c;后文简称 云女士 &#xff0c;非说 Go 的 Gin 框架比 Springboot 更加的开箱即用&#xff0c;我心想在 Java 里面 Springboot 已经打遍天下无敌手&#xff0c;这份底蕴岂是 Gin 能比。 但是云女士突出一个执拗&#xff0c;非我要…

使用国内镜像源加速Qt“更新/安装”的方法

QT更新/安装时&#xff0c;国外源下载很慢&#xff0c;国内镜像源也因网络环境的不同而速度各异&#xff0c;下文给出国内镜像源的配置方法。 一、命令行 1、切换对应目录&#xff0c;更新器默认目录是 C:\Qt 2、文件名镜像源 安装示例&#xff1a; .\qt-unified-windows-x…

Hbase整合Mapreduce案例2 hbase数据下载至hdfs中——wordcount

目录 整合结构准备数据下载pom.xmlMain.javaReduce.javaMap.java操作 总结 整合结构 和案例1的结构差不多&#xff0c;Hbase移动到开头&#xff0c;后面跟随MR程序。 因此对于输入的K1 V1会进行一定的修改 准备 在HBASE中创建表&#xff0c;并写入数据 create "wunaii…

python 装饰器学习与实践

目录 装饰器学习1、最基本装饰器2、函数带参数的装饰器3、装饰器带参数4、类中函数的装饰器5、装饰器实践6、pyqt5类中方法的装饰器实现时遇到的问题 装饰器学习 先假定一个场景 在之前的一篇文章中&#xff0c;分享了一个pyqt5将日志实时展示在gui界面上的功能python在pyqt5l…

OCR的评价指标和常用数据集

1.OCR任务简介 OCR(Optical Character Recognition,光学字符识别)是指对包含文本内容的图像或者视频进行处理识别&#xff0c;并提取其中所包含的文字及排版信息的过程。例如&#xff0c;一个常见的应用是将包含文档图像的不可编辑状态的 PDF 文档通过 OCR 技术识别后&#xf…

解决el-select数据量过大的3种方法

在准备上线的后台管理系统中&#xff0c;我们发现有两个下拉框&#xff08;select&#xff09;&#xff0c;其选项数据量超过 1 万条&#xff0c;而在测试环境中这些数据量只有几百条。这导致在页面加载时&#xff0c;浏览器性能出现瓶颈&#xff0c;页面卡顿甚至崩溃。 想了一…

计算机网络 第5章 运输层

计算机网络 &#xff08;第8版&#xff09; 第 5 章 传输层5.4 可靠传输的原理5.4.1 停止等待协议5.4.2 连续ARQ协议 5.5 TCP报文段的首部格式5.6 TCP可靠传输的实现5.6.1 以字节为单位的滑动窗口5.6.2 超时重传时间的选择 5.7 TCP的流量控制5.7.1 利用滑动窗口实现流量控制 5.…

【PyTorch】(基础三)---- 图像读取和展示

图像读取和展示 pytorch本身并不提供图像的读取和展示功能&#xff0c;利用pytorch执行计算机视觉任务的时候&#xff0c;通常是利用opencv等工具先进行图像处理&#xff0c;然后将结果转化成tensor类型传递给pytorch&#xff0c;在pytorch执行之后&#xff0c;也可以将tensor…

Java课程设计项目-servlet+jsp美食系统、菜品管理系统

文章目录 Java课程设计项目-servletjsp美食系统一、项目介绍二、技术介绍2.1 环境需要2.2 技术栈 环境需要三、功能实现3.1登录注册3.2首页菜品展示、轮播图3.3美食菜品分类、查询3.4作品动态、个人简介、菜品收藏3.5创建菜谱、添加步骤 四、系统代码展示4.1项目架构&#xff0…

使用Unity脚本模拟绳索、布料(碰撞)

效果演示&#xff1a; 脚本如下&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;namespace PhysicsLab {public class RopeSolver : MonoBehaviour {public Transform ParticlePrefab;public int Count 3;public int Space 1;…

Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo)

Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo) 目录 Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo) 一、简单介绍 二、PyTorch 三、CNN 1、神经网络 2、卷…

【Python网络爬虫笔记】8- (BeautifulSoup)抓取电影天堂2024年最新电影,并保存所有电影名称和链接

目录 一. BeautifulSoup的作用二. 核心方法介绍2.1 构造函数2.2 find()方法2.3 find_all()方法2.4 select()方法 三. 网络爬虫中使用BeautifulSoup四、案例爬取结果 一. BeautifulSoup的作用 解析HTML/XML文档&#xff1a;它可以将复杂的HTML或XML文本转换为易于操作的树形结构…

ZLMediaKit+wvp (ffmpeg+obs)推拉流测试

这里使用了两种方式: ffmpeg命令和 OBS OBS推流在网上找了些基本没有说明白的, 在ZLMediaKit的issues中看到了一个好大哥的提问在此记录一下 使用OBS推流&#xff0c;rtmp&#xff0c;报鉴权失败 推流 1. ffmpeg命令推流 官方说明文档地址: 推流规则 rtsp://192.168.1.4:10554…

Linux入门攻坚——40、Linux集群系统入门-lvs(1)

Cluster&#xff0c;集群&#xff0c;为了解决某个特定问题将多台计算机组合起来形成的单个系统。 这个单个集群系统可以扩展&#xff0c;系统扩展的方式&#xff1a;scale up&#xff0c;向上扩展&#xff0c;更换更好的主机&#xff1b;scale out&#xff0c;向外扩展&…

威胁驱动的网络安全方法论

本文主要内容取自洛克希德马丁公司的论文&#xff1a;A Threat-Driven Approach to Cyber Security&#xff0c;想要全面准确了解论文内容的朋友建议阅读原文。希望能够抛砖引玉&#xff0c;为相关领域的相关工作人员带来一点不同的思路或启发&#xff0c;从而更好地维护企业/组…