C# LINQ 详细用法以及概念

LINQ(Language Integrated Query)是C#和.NET框架中的一个强大功能,它允许开发者使用查询语法来访问和操作数据集合。LINQ提供了一种一致且直观的方式来处理不同类型的数据源,如集合、XML文档、数据库等。本文将详细讲解LINQ的各种属性和方法,以及如何在实际应用中使用它们。

1. LINQ 简介

LINQ 提供了一种声明性的语法,类似于SQL,可以对任何实现了 IEnumerable<T>IQueryable<T> 接口的数据源进行查询。它有以下几个主要的部分:

  • LINQ to Objects:对内存中的对象进行查询。
  • LINQ to XML:对XML数据进行查询。
  • LINQ to SQL:对SQL数据库进行查询。
  • LINQ to Entities:对Entity Framework数据模型进行查询。

2. 基本语法

2.1 查询表达式

查询表达式类似于SQL语法,主要由fromwhereselect等子句组成。例如:

// 定义数据源
int[] numbers = { 2, 3, 4, 5 };// 定义查询表达式
var result = from n in numberswhere n % 2 == 0select n;// 执行查询
foreach (var n in result)
{Console.WriteLine(n);
}

2.2 方法语法

LINQ也可以使用方法调用链来表达查询,这种语法通常与Lambda表达式一起使用。例如:

// 定义数据源
int[] numbers = { 2, 3, 4, 5 };// 定义查询
var result = numbers.Where(n => n % 2 == 0).Select(n => n);// 执行查询
foreach (var n in result)
{Console.WriteLine(n);
}

3. 常用方法

3.1 Where

Where 方法用于筛选数据集合中的元素。它接受一个返回布尔值的Lambda表达式作为参数。例如:

int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);foreach (var n in evenNumbers)
{Console.WriteLine(n); // 输出 2 和 4
}

3.2 Select

Select 方法用于将数据集合中的每个元素投射为新的形式。它接受一个Lambda表达式作为参数。例如:

int[] numbers = { 1, 2, 3, 4, 5 };
var squaredNumbers = numbers.Select(n => n * n);foreach (var n in squaredNumbers)
{Console.WriteLine(n); // 输出 1, 4, 9, 16, 25
}

3.3 OrderBy 和 OrderByDescending

OrderByOrderByDescending 方法用于对数据集合进行排序。它们接受一个用于排序的键选择器Lambda表达式。例如:

string[] names = { "Charlie", "Bob", "Alice" };
var sortedNames = names.OrderBy(name => name);foreach (var name in sortedNames)
{Console.WriteLine(name); // 输出 Alice, Bob, Charlie
}var sortedNamesDesc = names.OrderByDescending(name => name);foreach (var name in sortedNamesDesc)
{Console.WriteLine(name); // 输出 Charlie, Bob, Alice
}

3.4 GroupBy

GroupBy 方法用于将数据集合中的元素分组。它接受一个分组键选择器Lambda表达式。例如:

string[] words = { "apple", "banana", "apricot", "blueberry", "cherry" };
var groupedWords = words.GroupBy(word => word[0]);foreach (var group in groupedWords)
{Console.WriteLine($"Key: {group.Key}");foreach (var word in group){Console.WriteLine(word);}
}

3.5 Join

Join 方法用于连接两个数据集合。它接受四个参数:外部集合、内部集合、外键选择器、内键选择器和结果选择器。例如:

var students = new[]
{new { StudentId = 1, Name = "Alice" },new { StudentId = 2, Name = "Bob" }
};var scores = new[]
{new { StudentId = 1, Score = 90 },new { StudentId = 2, Score = 85 }
};var studentScores = students.Join(scores,student => student.StudentId,score => score.StudentId,(student, score) => new { student.Name, score.Score }
);foreach (var studentScore in studentScores)
{Console.WriteLine($"{studentScore.Name}: {studentScore.Score}");
}

4. 高级用法

4.1 集合运算符

LINQ 提供了一些集合运算符,如 UnionIntersectExcept,用于对集合进行并集、交集和差集操作。例如:

int[] set1 = { 1, 2, 3 };
int[] set2 = { 3, 4, 5 };var union = set1.Union(set2); // { 1, 2, 3, 4, 5 }
var intersect = set1.Intersect(set2); // { 3 }
var except = set1.Except(set2); // { 1, 2 }foreach (var n in union) { Console.WriteLine(n); }
foreach (var n in intersect) { Console.WriteLine(n); }
foreach (var n in except) { Console.WriteLine(n); }

4.2 聚合函数

LINQ 提供了一些聚合函数,如 CountSumAverageMinMax,用于对集合进行聚合计算。例如:

int[] numbers = { 1, 2, 3, 4, 5 };int count = numbers.Count(); // 5
int sum = numbers.Sum(); // 15
double average = numbers.Average(); // 3
int min = numbers.Min(); // 1
int max = numbers.Max(); // 5Console.WriteLine($"Count: {count}, Sum: {sum}, Average: {average}, Min: {min}, Max: {max}");

4.3 转换运算符

LINQ 提供了一些转换运算符,如 ToListToArrayToDictionary,用于将查询结果转换为其他集合类型。例如:

int[] numbers = { 1, 2, 3, 4, 5 };List<int> numberList = numbers.ToList();
int[] numberArray = numbers.ToArray();
Dictionary<int, int> numberDictionary = numbers.ToDictionary(n => n, n => n * n);foreach (var n in numberList) { Console.WriteLine(n); }
foreach (var n in numberArray) { Console.WriteLine(n); }
foreach (var kvp in numberDictionary) { Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}"); }

5. 实际应用中的例子

5.1 处理数据库

LINQ to SQL 或 LINQ to Entities(EF)可以用于查询数据库。例如,使用 Entity Framework:

using (var context = new SchoolContext())
{var students = context.Students.Where(s => s.Age > 18).ToList();foreach (var student in students){Console.WriteLine($"{student.Name}, {student.Age}");}
}

5.2 处理XML

LINQ to XML 可以用于查询和操作XML文档。例如:

XDocument doc = XDocument.Load("books.xml");var books = from book in doc.Descendants("book")where (int)book.Element("price") > 30select new{Title = (string)book.Element("title"),Price = (int)book.Element("price")};foreach (var book in books)
{Console.WriteLine($"{book.Title}, {book.Price}");
}

LINQ 在 C# 中非常强大且灵活的功能,它提供了多种操作数据集合的方式,让我们的代码更加简洁和可读。本文记录一下这些常用到的,以后可以来翻一翻

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

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

相关文章

计算机网络-第4章 网络层

4.1网络层的几个重要概念 4.1.1网络层提供的两种服务 电信网面向连接通信方式&#xff0c;虚电路VC。 互联网设计思路&#xff1a;网络层要设计得尽量简单&#xff0c;向其上层只提供简单灵活的&#xff0c;尽最大努力交付的数据报服务。 网络层不提供服务质量的承诺&#…

使用 Spring 配置邮件服务器

在现代的企业应用开发中&#xff0c;邮件发送是一个常见的需求。Spring 提供了强大的邮件支持&#xff0c;使得配置和发送邮件变得非常简单。本文将介绍如何在 Spring 应用中配置邮件服务器并发送电子邮件。 1. 引入 Spring 邮件依赖 首先&#xff0c;在项目的 pom.xml 文件中…

昇思学习打卡-10-ShuffleNet图像分类

文章目录 网络介绍网络结构部分实现对应网络结构 模型训练shuffleNet的优缺点总结优点不足 网络介绍 ShuffleNet主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&#xff1a;Pointwise G…

Activity启动模式探究

一、概括 Activity的启动模式主要分为四种&#xff1a;standard&#xff08;标准模式&#xff09;、singleTop&#xff08;栈顶复用模式&#xff09;、singleTask&#xff08;栈内复用模式&#xff09;和singleInstance&#xff08;单例模式&#xff09;。每种模式都有其特定的…

日常学习--20240705

1、IO流 按照IO操作的数据类型分为字节流和字符流&#xff1a; 字节流&#xff1a;又分为输入流&#xff08;其他程序传递过来的数据&#xff0c;读取流中的数据&#xff09;和输出流&#xff08;往流中写数据&#xff0c;传递给其他程序&#xff09;;可以操作二进制文件&…

国内采用docker部署open-metadata

背景 最近看看开源的元数据管理项目&#xff0c;比较出名点的有open-metadata、datahub、OpenLineage、atlas。 open-metadata有1千多的贡献者&#xff0c;4.8K的stars&#xff0c;社区现在也比较活跃&#xff0c;支持的数据库类型还蛮多&#xff0c;基本市面上常见的都有支持…

使用Python连接本地MySQL数据库并创建表后添加数据

一、使用Python连接本地MySQL数据库并创建表后添加数据 端口号&#xff1a;3307 用户名&#xff1a;root 密码&#xff1a;lms123456 数据库&#xff1a;test_01 from orm import *# 数据库连接对象 db MySQLDatabase(host"localhost",port3307,user"root…

【每日一练】python三目运算符的用法

""" 三目运算符与基础运算的对比 """ a 1 b 2#1.基础if运算判断写法&#xff1a; if a > b:print("基础判断输出&#xff1a;a大于b") else:print("基础判断输出&#xff1a; a不大于b")#2.三目运算法判断&#xff1a;…

揭秘IP:从虚拟地址到现实世界的精准定位

1.IP地址介绍 1.内网 IP 地址&#xff08;私有 IP 地址&#xff09; 内网 IP 地址&#xff0c;即私有 IP 地址&#xff0c;是在局域网&#xff08;LAN&#xff09;内部使用的 IP 地址。这些地址不会在公共互联网中路由&#xff0c;因此可以在多个局域网中重复使用。私有 IP 地…

股票Level-2行情是什么,应该怎么使用,从哪里获取数据

行情接入方法 level2行情websocket接入方法-CSDN博客 相比传统的股票行情&#xff0c;Level-2行情为投资者打开了更广阔的视野&#xff0c;不仅限于买一卖一的表面数据&#xff0c;而是深入到市场的核心&#xff0c;提供了十档乃至千档的行情信息&#xff08;沪市十档&#…

解决Java中的跨平台开发与部署问题

解决Java中的跨平台开发与部署问题 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 跨平台开发的挑战与需求 随着软件应用的普及和多样化&#xff0c;开发人员经常面临将应用程序在不同操作系统…

STM32第十六课:WiFi模块的配置及应用

文章目录 需求一、WiFi模块概要二、配置流程1.配置通信串口&#xff0c;引脚和中断2.AT指令3.发送逻辑编写 三、需求实现代码总结 需求 完成WiFi模块的配置,使其最终能和服务器相互发送消息。 一、WiFi模块概要 本次使用的WiFi模块为ESP-12F模块&#xff08;安信可&#xf…

【LLM第8篇】Delta Tuning

如何对large-scale PLM进行调整呢&#xff1f; 一个有效的方式是delta tuning&#xff1b;只更新PLM中的一小部分参数&#xff0c;其它参数不动。 把解决任务的能力具象化成delta object这样的参数&#xff0c;只需要几十兆参数存储。 过去模型参数是随机的&#xff0c;现在预…

【MySQL】逻辑架构与存储引擎

一、逻辑架构 1、MySQL逻辑架构 我们可以根据上图来对sql的执行过程进行分析 第一步&#xff1a;客户端与服务器建立一个连接&#xff0c;从连接池中分配一个线程处理SQL语句第二步&#xff1a;SQL接口接受SQL指令第三步&#xff1a;如果是5.7版本&#xff0c;就会先去缓存中…

Git 一种分布式版本控制系统

Git 是一种分布式版本控制系统&#xff0c;用于管理和追踪文件的修改历史。它具有以下基本概念和使用方式&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;Git 将文件存储在仓库中&#xff0c;并记录文件的修改历史。仓库可以是本地仓库或远程仓库&#xff0c…

Python字符串处理常用的30种操作

我们平时编写代码时&#xff0c;经常需要对字符串进行处理&#xff0c;本文详细介绍Python处理字符串常用的30种操作&#xff0c;并给出了对应的代码。 分割 使用split()方法将字符串按照指定的分隔符进行分割。 s "Hello,World" result s.split(","…

国产AI芯片被撕下遮羞布,宁买阉割八成性能的NVIDIA,也不买国产

曾经有传言指有国产AI芯片大受欢迎&#xff0c;还卖出了100万片&#xff0c;不过半年多时间过去&#xff0c;海外分析机构指出国内的互联网企业纷纷抢购NVIDIA阉割八成性能的H20&#xff0c;至于国产AI芯片则不获欢迎。 导致如此结果&#xff0c;在于NVIDIA拥有许多独特的优势&…

什么是voc数据,和coco数据的区别是什么?

Pascal VOC 数据集格式 Pascal VOC 数据集的标注文件使用 XML 格式&#xff0c;每个图像对应一个 XML 文件&#xff0c;文件内容包含图像的元数据信息和目标的标注信息。XML 文件结构如下&#xff1a; <annotation><folder>VOC2007</folder><filename&g…

【工具问题】macOS Ventura 下如何开启NTFS移动硬盘读写?

花了半小时&#xff0c;网上检索了各种解决方案&#xff0c;发现还是下面这种方案可行&#xff0c;mark下方便下次遇到问题能更快速解决&#xff5e; macOS Ventura 下如何开启NTFS移动硬盘读写&#xff1f;

论文略读: LLaMA Pro: Progressive LLaMA with Block Expansion

ACL 2024 人类通常在不损害旧技能的情况下获得新技能 然而&#xff0c;对于大型语言模型&#xff08;LLMs&#xff09;&#xff0c;例如从LLaMA到CodeLLaMA&#xff0c;情况正好相反。深度学习笔记&#xff1a;灾难性遗忘-CSDN博客——>论文提出了一种用于LLMs的新的预训练…