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

http://www.lryc.cn/news/418176.html

相关文章:

  • 根据bean的名称获取bean,静态方法查询数据库
  • 剪画小程序:音频剪辑新手入门:基础操作指南!
  • IDEA中maven jar下载失败问题处理
  • C++中,函数返回const类型有什么作用,请举例说明
  • Html详解——Vue基础
  • 【安规电容知识点总结】
  • R9000P 双系统安装 win11 和 ubuntu
  • 8月8日笔记
  • 【单片机开发软件】使用VSCode开发STM32环境搭建
  • 第十五届蓝桥杯大赛青少组——赛前解析(算法)
  • 工作助手C#研究笔记(5)
  • 【kali靶机之serial】--反序列化漏洞实操
  • 学习大数据DAY34 面向对象思想深化练习 将从豆瓣爬取的数据置入自己搭建的网站上
  • 【开端】通过Java 过滤器灵活配置URL访问权限,并返回403
  • 【C++综合项目】——基于Boost库的搜索引擎(手把手讲解,小白一看就会!!)
  • 强化阶段《660》和《880》哪本优先级高?
  • Redis远程字典服务器(2) —— 全局命令
  • Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?
  • tomcat文件上传漏洞练习
  • 项目实战_图书管理系统(简易版)
  • Gazebo之MyRobot建立
  • WPF学习(5)- Border控件(边框布局)+GridSplitter分割窗口
  • ADAS芯片及方案
  • 5 mysql 查询语句
  • 从网络上下载并展示图像数据
  • Machine-Learning 机器学习
  • CSP 2023 普及组第一轮 - CSP/S 2023初试题 基础部分解析
  • 解锁IPython的跨平台魔法:深入探索%%script命令的神秘力量
  • 如何避免项目发布后用户从浏览器WebPack中看到源码
  • java学习19VUE