当前位置: 首页 > news >正文

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

文章目录

    • 一、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中的元素运算符来对集合进行精确的操作和查询,从而轻松地提取所需的数据或执行复杂的数据处理逻辑。这些功能不仅提高了代码的可读性和可维护性,还使得处理集合数据更加高效和直观。

相关文章:

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

文章目录 一、LINQ元素运算符概述二. ElementAt 和 ElementAtOrDefault三. First 和 FirstOrDefault四. Last 和 LastOrDefault五. Single 和 SingleOrDefault六. Where 和 Select七、实际应用场景示例总结 LINQ&#xff08;Language-Integrated Query&#xff09;是C#中强大且…...

根据bean的名称获取bean,静态方法查询数据库

根据bean名称获取bean 1.先创建bean&#xff0c;如template package com.test.game.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate;import…...

剪画小程序:音频剪辑新手入门:基础操作指南!

亲爱的小伙伴们&#xff0c;你是否对音频剪辑充满好奇&#xff0c;却不知道从何下手&#xff1f;今天&#xff0c;就让我们用【剪画】一起揭开音频剪辑基础操作的神秘面纱&#xff01; 音频拼接——打造个性音乐串烧 音频拼接是将多个音频片段组合在一起&#xff0c;创造出独特…...

IDEA中maven jar下载失败问题处理

前言 对于在IDEA中maven爆红问题&#xff0c;主要分为两类&#xff0c;一个是全部爆红&#xff0c;一个是部分爆红。 全部爆红 这类问题主要是maven配置没有搞好&#xff0c;可以根据下列步骤自查 1.配置好国内的Maven源 第一步:打开IDEA&#xff0c;查看配置 第二步: 检查…...

C++中,函数返回const类型有什么作用,请举例说明

在C中&#xff0c;函数返回const类型的主要作用是确保返回的对象不会被修改。这种保护机制增强了代码的健壮性和可维护性&#xff0c;尤其是在你希望保证函数返回的数据不被意外篡改时。下面通过几个例子来说明函数返回const类型的作用。 例子 1: 返回常量引用 当你从函数中返…...

Html详解——Vue基础

HTML是什么&#xff1f; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用来结构化 Web 网页及其内容的标记语言。网页内容可以是&#xff1a;一组段落、一个重点信息列表、也可以含有图片和数据表…...

【安规电容知识点总结】

安规电容知识点总结 安规电容简介安规电容的种类X电容和Y电容X电容和Y电容示意图安规电容的型号与应用安规电容简介 安规电容:是指用于这样的场合,即电容器失效后,不会导致电击,不会危及到人身安全。 具体来说,所谓安规电容是一种与普通电容相比符合安全认证的电容,故称…...

R9000P 双系统安装 win11 和 ubuntu

网上了解到一堆关于 r9000p 安装较老的ubuntu系统&#xff0c;会有一堆问题 可能是电脑硬件比较新&#xff0c;较老的系统相关方面不兼容 那么干脆直接装新一点的系统 我安装了 Ubuntu 22.04 1 根据相关教程利用u盘制作系统盘 ultraISO 推荐使用清华源 速度快一点 https://…...

8月8日笔记

8月8日笔记 msf常见命令 启动MSF控制台 msfconsole: 启动MSF控制台。msfconsole -h: 显示帮助菜单。msfconsole -q: 启动MSF控制台并立即退出。 导航和管理 back: 返回上一级菜单。exit: 退出MSF控制台。banner: 显示MSF的横幅。cd: 更改工作目录。color: 开启或关闭彩色输…...

【单片机开发软件】使用VSCode开发STM32环境搭建

&#x1f48c; 所属专栏&#xff1a;【单片机开发软件技巧】 &#x1f600; 作  者&#xff1a; 于晓超 &#x1f680; 个人简介&#xff1a;嵌入式工程师&#xff0c;专注嵌入式领域基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大家&#xff1…...

第十五届蓝桥杯大赛青少组——赛前解析(算法)

算法&#xff1a;进制转换、模拟算法&#xff0c;枚举算法&#xff0c;冒泡排序&#xff0c;插入排序&#xff0c;选择排序&#xff0c;递推算法&#xff0c;递归算法&#xff0c;贪心算法。 1.进制转换 二进制&#xff1a;只包含0和1 八进制&#xff1a;只包含0-7 十进制&…...

工作助手C#研究笔记(5)

通过示例对C#程序的结构逻辑进行研究梳理&#xff0c;虽然通过阅读相关书籍&#xff0c;但是来的效果更慢。一下相关内容可能有误&#xff0c;请谨慎听取。 TaskToDoList-master 1.XAML “XAML”是WPF中专门用于设计UI的语言&#xff0c;优点是 1.XAML可以设计出专业的UI和…...

【kali靶机之serial】--反序列化漏洞实操

kali靶机配置 【我图片里没有截图的默认配置即可】需要改的地方图片里面都有。 使用kali扫描网关的主机。 扫到一个开放了80端口HTTP协议的主机ip 访问80端口 会看到一个文本页面&#xff0c;翻译一下看是什么意思。。 F12查看cookie&#xff0c;是一个base64编码了的东西 使…...

学习大数据DAY34 面向对象思想深化练习 将从豆瓣爬取的数据置入自己搭建的网站上

目录 查看电影类型的电影列表 添加电影 修改电影 上机练习 13 使用三层架构完善 web 系统 查看电影类型的电影列表 DAL.py 文件 class MovieDAL(DBHelper): def getMovieByTid(self,typeid): sqlf"""select id,title,release_date,score,tname from Mo…...

【开端】通过Java 过滤器灵活配置URL访问权限,并返回403

一、绪论 在JAVA项目系统中&#xff0c;后端给前端提供接口。但是在某些场景我们需要临时控制接口是否能被访问。或关闭某一接口的访问权限。 比如某一接口被攻击了或者某一接口存在漏洞&#xff0c;在系统不关闭的情况下&#xff0c;如何控制系统的访问权限。 二、控制接口访…...

【C++综合项目】——基于Boost库的搜索引擎(手把手讲解,小白一看就会!!)

目录 一、前言 二、项目的相关背景 ⚡什么是Boost库&#xff1f;⚡ ⚡什么是搜索引擎&#xff1f;⚡ ⚡为什么要做Boost搜索引擎&#xff1f;⚡ 二、搜索引擎的宏观原理 三、搜索引擎技术栈和项目环境 四、正排索引 VS 倒排索引 —— 搜索引擎的具体原理 &#x…...

强化阶段《660》和《880》哪本优先级高?

现在8月份了&#xff0c;正是考研数学复习的关键时刻&#xff0c;大家应该正在痛快的刷题&#xff01; 如果你正在做660880&#xff0c;那么这篇笔记值得花五分钟看完&#xff0c;一定会让你刷660和880的质量和速度提高一个层次&#xff01; 首先我们要知道660和880都怎么用&…...

Redis远程字典服务器(2) —— 全局命令

一&#xff0c;使用官方文档 学会使用文档&#xff0c;是一个优秀程序员的必备技能。Redis的命令非常多&#xff08;上百个&#xff09;&#xff0c;因为Redis是通过键值对存储数据的&#xff0c;key为string类型&#xff0c;但是value可以是其它的数据类型&#xff08;字符串…...

Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?

技术背景 我们知道&#xff0c;Android平台不管RTMP推送、轻量级RTSP服务模块还是GB28181设备接入模块&#xff0c;早期&#xff0c;如果需要实现截图功能&#xff0c;又不想依赖Android系统接口&#xff0c;最好的办法是&#xff0c;在底层实现快照截图。 快照截图&#xff…...

tomcat文件上传漏洞练习

1、靶场账号注册 vulfocus 注册后邮箱中点击激活 2、首页选择并开启靶场 复制映射的ip和端口 在浏览器输入ip和端口 改成put并把1.jsp中内容复制进去 3打开哥斯拉&#xff0c;连接上面的网址...

CefFlashBrowser:拯救Flash游戏的终极方案,你的童年记忆有救了!

CefFlashBrowser&#xff1a;拯救Flash游戏的终极方案&#xff0c;你的童年记忆有救了&#xff01; 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 还记得那些年我们一起在4399、7k7k网站…...

写段代码教会你什么是HOOK技术?HOOK技术能干什么?品

为 HagiCode 添加 GitHub Pages 自动部署支持 本项目早期代号为 PCode&#xff0c;现已正式更名为 HagiCode。本文记录了如何为项目引入自动化静态站点部署能力&#xff0c;让内容发布像喝水一样简单。 背景/引言 在 HagiCode 的开发过程中&#xff0c;我们遇到了一个很现实…...

Java 响应式编程最佳实践:构建高效的异步应用

Java 响应式编程最佳实践&#xff1a;构建高效的异步应用别叫我大神&#xff0c;叫我 Alex 就好。一、引言 大家好&#xff0c;我是 Alex。响应式编程作为一种编程范式&#xff0c;已经在 Java 生态系统中变得越来越重要。随着 Spring WebFlux、Project Reactor 和 RxJava 等框…...

轴向磁通电机仿真避坑指南:ANSYS Maxwell 3D建模时气隙与对称性的7个关键设置

轴向磁通电机3D仿真进阶指南&#xff1a;从参数校准到高效求解的实战技巧 轴向磁通电机因其紧凑结构和高效能特性&#xff0c;正在新能源车、航空航天等领域获得广泛应用。但不同于传统径向电机&#xff0c;其三维电磁场分布的复杂性使得仿真过程常成为工程师的"噩梦"…...

别再乱删了!手把手教你用官方工具彻底卸载Autodesk全家桶(3ds Max/CAD)

彻底告别安装失败&#xff01;Autodesk软件专业卸载与重装全指南 你是否曾经遇到过这样的困扰&#xff1a;明明已经卸载了3ds Max或AutoCAD&#xff0c;重新安装时却频频报错&#xff1f;那些隐藏在系统深处的残留文件就像顽固的污渍&#xff0c;无论你怎么擦洗都挥之不去。本…...

1995-1996 年阿拉斯加北坡 ARCSS/LAII 通量站点的北极植被样地

Arctic Vegetation Plots at ARCSS/LAII Flux Sites, North Slope, Alaska, 1995-1996 简介 本数据集提供了 1995 年和 1996 年 8 月在北坡北极系统科学/陆地-大气-冰相互作用&#xff08;ARCSS/LAII&#xff09;项目通量塔站点采集的植被覆盖、环境样地和土壤数据。19 个 AR…...

为什么92%的Python工程师还没掌握无锁并发?——CPython 3.13 subinterpreter实战避坑清单(含内存泄漏检测脚本)

第一章&#xff1a;无锁并发的底层逻辑与CPython 3.13 subinterpreter革命性意义无锁并发&#xff08;Lock-Free Concurrency&#xff09;并非简单地“不用锁”&#xff0c;而是通过原子操作&#xff08;如 compare-and-swap、load-acquire/store-release&#xff09;构建线程安…...

3分钟打造专业数据大屏:DataRoom开源可视化设计器终极指南

3分钟打造专业数据大屏&#xff1a;DataRoom开源可视化设计器终极指南 【免费下载链接】DataRoom &#x1f525;基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的大屏设计器&#xff0c;具备目录管理、DashBoard设计、预览能力&#xff0c;支持MySQL、Oracl…...

深度神经网络训练全攻略:从梯度消失到Adam优化器,一篇搞懂所有技巧

训练深度神经网络就像调教一匹烈马——既要选对方向&#xff08;优化器&#xff09;&#xff0c;又要控制好缰绳&#xff08;学习率&#xff09;&#xff0c;还得给它戴好马鞍&#xff08;正则化&#xff09;。本文将带你系统掌握这些核心技巧&#xff0c;从此告别“训练不收敛…...

【WRF-Chem编译安装】使用集群系统环境编译安装WRF-Chem

目录 安装编译思路 编译错误记录 尝试编译器:Intel 尝试编译器:Gun 附录:完整自动化编译脚本 参考 安装编译思路 使用集群系统自带的 module 加载 MPI 和编译器: module avail # 查看可用的模块 module load compiler/intel # (举例) 加载编译器 module load mpi/open…...