探秘C# LINQ元素运算:原理阐释与实践指南

news2024/9/25 3:18:54

文章目录

    • 一、LINQ元素运算符概述
    • 二. ElementAt 和 ElementAtOrDefault
    • 三. First 和 FirstOrDefault
    • 四. Last 和 LastOrDefault
    • 五. Single 和 SingleOrDefault
    • 六. Where 和 Select
    • 七、实际应用场景示例
    • 总结

在这里插入图片描述


LINQ(Language-Integrated Query)是C#中强大且广泛使用的功能,它允许开发人员在编写代码时使用类SQL语句的方式来查询、过滤和操作各种数据源,如集合、数据库和XML等。在LINQ中,元素运算符(Element Operators)是用来访问和操作集合中的元素的方法。下面详细介绍各个常用的元素运算符及其示例应用。

一、LINQ元素运算符概述

LINQ元素运算符包括以下几种:

  • ElementAt:返回集合中指定索引处的元素。
  • ElementAtOrDefault:返回集合中指定索引处的元素;如果索引超出范围,则返回默认值。
  • First:返回集合的第一个元素或满足条件的第一个元素。
  • FirstOrDefault:返回集合的第一个元素或满足条件的第一个元素。 如果此类元素不存在,则返回默认值。
  • LastOrDefault:返回集合的最后一个元素或
    满足条件的最后一个元素。如果此类元素不存在,则返回默认值。
  • Single:返回集合的唯一一个元素或满足条件的唯一一个元素。如果没有要返回的元素或要返回多个元素,则引发InvalidOperationException。
  • SingleOrDefault:返回集合的唯一一个元素或满足条件的唯一一个元素。如果没有要返回的元素,则返回默认值。 如果要返回多个元素,则引发InvalidOperationException。
  • Where:根据条件筛选集合中的元素
  • Select:将集合中的元素投影到新的形式。

二. ElementAt 和 ElementAtOrDefault

这两个方法用于根据索引获取集合中的元素。

ElementAt(int index): 返回集合中指定索引位置的元素。如果索引超出集合范围,会抛出 ArgumentOutOfRangeException 异常。
示例:

List<string> fruits = new List<string> { "apple", "banana", "cherry", "date" };
string fruit = fruits.ElementAt(2); // 获取索引为2的元素,结果为 "cherry"

ElementAtOrDefault(int index): 返回集合中指定索引位置的元素,如果索引超出范围,则返回默认值(null或者类型的默认值)。
示例:

List<string> fruits = new List<string> { "apple", "banana", "cherry", "date" };
string fruit = fruits.ElementAtOrDefault(10); // 索引10超出范围,返回默认值null

三. First 和 FirstOrDefault

这两个方法用于获取集合中满足条件的第一个元素。

First(): 返回集合中满足条件的第一个元素。如果集合为空或者没有满足条件的元素,会抛出 InvalidOperationException 异常。
示例:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
int first = numbers.First(); // 返回集合中的第一个元素,结果为 1

FirstOrDefault(): 返回集合中满足条件的第一个元素,如果没有满足条件的元素,则返回默认值。
示例:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
int firstOrDefault = numbers.FirstOrDefault(x => x > 10); // 没有大于10的元素,返回默认值0

四. Last 和 LastOrDefault

这两个方法用于获取集合中满足条件的最后一个元素。

Last(): 返回集合中满足条件的最后一个元素。如果集合为空或者没有满足条件的元素,会抛出 InvalidOperationException 异常。
示例:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
int last = numbers.Last(); // 返回集合中的最后一个元素,结果为 5

LastOrDefault(): 返回集合中满足条件的最后一个元素,如果没有满足条件的元素,则返回默认值。
示例:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
int lastOrDefault = numbers.LastOrDefault(x => x < 0); // 没有小于0的元素,返回默认值0

五. Single 和 SingleOrDefault

这两个方法用于获取集合中满足条件的唯一元素。

Single(): 返回集合中满足条件的唯一元素。如果集合为空、有多个满足条件的元素或者没有满足条件的元素,会抛出异常。
示例:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
int single = numbers.Single(x => x == 3); // 返回集合中值为3的唯一元素

SingleOrDefault(): 返回集合中满足条件的唯一元素,如果没有满足条件的元素,则返回默认值。
示例:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
int singleOrDefault = numbers.SingleOrDefault(x => x == 10); // 没有值为10的元素,返回默认值0

六. Where 和 Select

这两个方法是LINQ中常用的筛选和投影方法。

Where(Func<TSource, bool> predicate): 根据条件筛选集合中的元素。
示例:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(x => x % 2 == 0); // 筛选出偶数,结果为 { 2, 4 }

Select(Func<TSource, TResult> selector): 将集合中的元素投影到新的形式。
示例:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var squares = numbers.Select(x => x * x); // 将每个元素平方,结果为 { 1, 4, 9, 16, 25 }

七、实际应用场景示例

假设有一个简单的类 Person:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

我们可以使用上述元素运算符来操作 List 类型的集合:

List<Person> people = new List<Person>
{
    new Person { Name = "Alice", Age = 25 },
    new Person { Name = "Bob", Age = 30 },
    new Person { Name = "Charlie", Age = 28 },
    new Person { Name = "David", Age = 22 }
};

// 示例1: 获取集合中第二个人的名字
string secondPersonName = people.ElementAt(1).Name;
Console.WriteLine($"Second person's name: {secondPersonName}");

// 示例2: 查找年龄大于等于30岁的第一个人
Person firstPersonOver30 = people.FirstOrDefault(p => p.Age >= 30);
if (firstPersonOver30 != null)
{
    Console.WriteLine($"First person over 30: {firstPersonOver30.Name}");
}
else
{
    Console.WriteLine("No person over 30 found.");
}

// 示例3: 计算集合中人的平均年龄
double averageAge = people.Select(p => p.Age).Average();
Console.WriteLine($"Average age: {averageAge}");

总结

通过这些示例,我们可以看到如何使用LINQ中的元素运算符来对集合进行精确的操作和查询,从而轻松地提取所需的数据或执行复杂的数据处理逻辑。这些功能不仅提高了代码的可读性和可维护性,还使得处理集合数据更加高效和直观。

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

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

相关文章

Linux基础IO——重定向与文件缓冲区

文章目录 重定向重定向的系统调用C语言中的FILE结构体 文件缓冲区C语言缓冲区 重定向 我们在学习Linux的基本内容时候&#xff0c;知道>> >都可以用来表示重定向&#xff0c;那么重定向的本质是什么呢&#xff0c;其实就是更改了标号为1的文件描述符 1表示标准输出&…

虚实共生:数字孪生技术引领设施农业新未来

在全球人口持续增长和气候变化日益严峻的背景下,设施农业正面临前所未有的挑战和机遇。如何在有限的资源条件下提高作物产量、质量和生产效率,成为困扰农业从业者的核心问题。随着人工智能、物联网和大数据等新兴技术的快速发展,数字化转型为设施农业带来了新的希望。其中,数字…

如何为树莓派添加人工智能超能力!

Raspberry Pi AI 套件价格实惠&#xff0c;安装简单&#xff0c;只要你能找到一个。 Adrian Kingsley-Hughes/ZDNET ZDNET 的关键要点 Raspberry Pi 基金会发布了适用于 Pi 5 的 Raspberry Pi AI 套件&#xff0c;但供应情况并不稳定。在撰写本文时&#xff0c;我在亚马逊和芝…

跟《经济学人》学英文:2024年08月03日这期 What is the point of industry awards?

What is the point of industry awards? Booze, sweat and plexiglass booze&#xff1a;美 [buz] 酒精饮料&#xff1b;烈酒&#xff1b;<俚>喝酒 sweat&#xff1a;英 [swet] 汗水&#xff1b;辛勤劳动 注意发音 plexiglass&#xff1a;美 [pleksɪˌglɑs] 树脂玻…

“消费新纪元:探索‘消费增值’的无限可能“

亲爱的顾客们&#xff0c;你们好&#xff01;今天&#xff0c;我想深入谈谈一种正在革新我们消费体验的模式——我们称之为“消费增值”。这个模式不仅仅保留了购物的乐趣&#xff0c;更在每一笔交易中融入了额外的价值&#xff0c;让消费过程焕发新生。 长久以来&#xff0c;我…

Google 高级搜索操作符

在 Google 搜索中&#xff0c;有些高级搜索操作符&#xff0c;它可以帮助你找到特定类型的文件。以下是一些常见的搜索操作符及其用途&#xff1a; filetype: — 搜索特定类型的文件。例如&#xff1a; filetype:pdf 人工智能 可以找到所有包含“人工智能”的 PDF 文件。 filet…

天机学堂 第6天 点赞逻辑

首先我们来分析整理一下点赞业务的需求&#xff0c;一个通用点赞系统需要满足下列特性&#xff1a; 通用&#xff1a;点赞业务在设计的时候不要与业务系统耦合&#xff0c;必须同时支持不同业务的点赞功能 独立&#xff1a;点赞功能是独立系统&#xff0c;并且不依赖其它服务。…

RM小陀螺技术经验与思考

移动小陀螺的原理&#xff1a; 先调好云台&#xff0c;车移动云台方向不动。然后可以用电机和底盘的机械角度来计算 涉及到两个知识点&#xff1a;速度闭环和变换矩阵。。。 把mpu的值映射到脉轮上面&#xff0c;就是说根据yaw电机编码器和mpu的差值来计算麦轮解算的x 和y的移…

开发android app用于移远模块读写IMEI 模组EC200DEULA-D08-SNNDA 支持socket连接读写IMEI

开放权限 adb kill-serveradb rootadb shell setenforce 0adb install -t app-debug.apkadb shell am start -n com.azhon.spplus/.MainActivity::F310A_WriteIMEI -DWadb.exe forward tcp:5902 tcp:5902pause写读IMEI ADB socket协议 TCP 127.0.0.1:5902 PC与终端APP之间 j…

商业数据分析PPT制作大纲系列一进入数据分析世界(需PPT私)

PART 1数据挖掘:从海量信息中淘出真金 数据挖掘是在海量的数据中发现有价值信息和知识的过程。它就像是一位经验丰富的矿工,在堆积如山的数据矿石中,精准地筛选出珍贵的金子。 引言: 数据挖掘的定义与价值技术概览: 关键算法(如决策树、K-means聚类、关联规则); 步骤…

简单搭建vue项目

1.先安装node.js和vite&#xff0c;具体参考&#xff1a; 2.管理员身份运行cmd&#xff0c;跳转到node安装目录&#xff1a; 输入&#xff1a; npm create vitelatest 输入项目名称&#xff0c;选择vue和JavaScript 2.VisualStudioCode打开(可能需要管理员权限)创建的文件夹,点…

Sqlserver 备份表

Sqlserver 备份表 1、右键数据库->任务->生成脚本 2、在引导界面点击下一步 3、选择需要导出的表 4、在高级里面选择备份数据与架构&#xff0c;然后再单选每个对象一个文件 每个对象一个文件是有多个表的情况下备份成多个文件&#xff0c;否则所有表都在一个文件中 架…

告别盲目找货!以图搜货神器,精准定位全网低价同款货源

做生意进入图搜源头时代&#xff0c;图搜进货实现了商机“所见即所得”。一位短视频平台的服装商家说&#xff0c;平时她看到同行的一个爆款&#xff0c;不好意思打听货源&#xff0c;也很难打听到&#xff0c;现在只要截个图一搜&#xff0c;就能找到1688对应的源头工厂。 今…

【第17章】Spring Cloud之Gateway服务调用

文章目录 前言一、用户服务二、网关服务1. 负载均衡2. 服务调用3. 登录拦截器 三、单元测试1. 启动服务2. 用户不存在3. 正常登录 总结 前言 在上一章我们使用JWT简单完成了用户认证&#xff0c;【第16章】Spring Cloud之Gateway全局过滤器(安全认证)&#xff0c;上一章内容已…

Node.js是什么?如何安装

目录 一、前言 1、JavaScript语言-----前端开发 2、JavaScript语言-----后端开发 总结&#xff1a;如果我们写了一段 js 代码&#xff0c;把他放到浏览器中执行&#xff0c;是在做前端开发&#xff1b;如果放在Node.js下运行&#xff0c;是在做后端开发。 二、安装 1、打开…

GHOST重装系统后的分区失踪:数据恢复实战指南

一、引言&#xff1a;GHOST重装引发的数据隐忧 在计算机维护的众多手段中&#xff0c;GHOST重装系统以其高效、便捷的特点深受用户喜爱。然而&#xff0c;这一过程往往伴随着风险&#xff0c;其中之一便是分区丢失的隐患。当GHOST重装操作不当或遭遇意外情况时&#xff0c;原本…

制作喇叭接口拓展

今天发现音响只有两个音频输出口&#xff0c;而喇叭有三个&#xff0c;就想着改装成可以装三个&#xff0c;电脑桌上一个&#xff0c;脚底下两个&#xff0c;从抽屉里翻出来了一个电视上拆下来的三色莲花口&#xff0c;它本来是一个视频输入&#xff0c;两个音频输入&#xff0…

硬币计数器——Arduino

硬币计数器——Arduino 硬币计数盒模型计数传感器硬币计数盒接线计数器程序 硬币计数盒模型 计数传感器 硬币计数盒接线 计数器程序 // 包含TM1637库&#xff0c;这是一个用于驱动TM1637数码管的模块 #include <TM1637.h>// 使用volatile关键字声明布尔变量jishu&#x…

Redis远程字典服务器(1)—— 初识Redis

目录 一&#xff0c;关于Redis 二&#xff0c;Redis特性介绍 2.1 In-memory data structures&#xff08;在内存中存储数据&#xff09; 2.2 Programmablilty&#xff08;编程能力&#xff09; 2.3 Extensibility&#xff08;扩展能力&#xff09; 2.4 Persistence&#…

食家巷小程序:传统面点与平凉特产的美味盛宴

在美食的世界里&#xff0c;总有一些角落等待着我们去探索&#xff0c;而食家巷小程序就是这样一个为您开启美食宝藏的钥匙。 一、传统面点&#xff0c;传承千年的美味 食家巷小程序为您呈现了种类丰富的传统面点&#xff0c;每一款都蕴含着深厚的历史和文化底蕴。 平凉锅盔&…