C#开发-集合使用和技巧(四)集合中常用的查询方法

集合中常用的查询方法

  • 测试数据准备:
  • 查询方法详解
    • **Where**条件查询
      • 定义和注释:
      • 功能
      • 详细说明:
      • 应用实例
        • 查找所有设备类型为“生产设备”的对象
      • 结果测试:
        • 查询所有测试结果大于90的设备
        • 多条件查询:类型为生产设备同时测试结果大于90的设备
    • **First/FirstOrDefault**
      • 功能:
      • 示例:
        • 查找id为xxx的设备
        • 查询id大于200的设备
      • 方法区别:
        • 示例:查找一个不存在的设备
      • 定义和注释:
    • **All**
      • 功能:
      • 示例:
        • 查询是否所有设备都达标(测试结果大于90)
    • **Any**
      • 功能:
      • 示例:
    • **Count**
      • 功能:
      • 示例:
      • 获集合数量
        • 获取生产设备的数量
  • 总结
  • 完整示例

本篇介绍集合的各种查询方法和使用

主要介绍条件查询Where,单个对象查询First/FirstOrDefault、功能查询All、Any、Count等

测试数据准备:

定义 一个Device 类,包括设备ID,名称,类型和测试结果,然后初始化添加4条数据

     /// <summary>
     /// 设备类
     /// </summary>
    class Device
   {
       /// <summary>
       /// Id
       /// </summary>
       public int Id { get; set; }

       /// <summary>
       /// 设备类型
       /// </summary>
       public string Type { get; set; }

       /// <summary>
       /// 名称
       /// </summary>
       public string Name { get; set; }


       /// <summary>
       /// 测试结果
       /// </summary>
       public int Result { get; set; }


   }
 
 
 //初始化数据
 List<Device> list = new List<Device>();
 list.Add(new Device() { Id = 101, Name = "1号设备", Type = "生产设备", Result = 99 });
 list.Add(new Device() { Id = 102, Name = "2号设备", Type = "生产设备", Result = 60 });
 list.Add(new Device() { Id = 103, Name = "3号设备", Type = "测试设备", Result = 98 });
 list.Add(new Device() { Id = 104, Name = "4号设备", Type = "测试设备", Result = 70 });
 list.Add(new Device() { Id = 201, Name = "5号生产设备", Type = "生产设备", Result = 100 });
 list.Add(new Device() { Id = 202, Name = "6号测试设备", Type = "测试设备", Result = 89 });
 list.Add(new Device() { Id = 203, Name = "7号测试设备", Type = "测试设备", Result = 98 });
 list.Add(new Device() { Id = 204, Name = "8号测试设备", Type = "测试设备", Result = 95 });

当然,让我详细介绍一下这些常用的 LINQ 查询方法:

查询方法详解

Where条件查询

定义和注释:

// 摘要:
//     根据条件过滤序列中的值。
//
// 参数:
//   source:
//     要过滤的 IEnumerable`1 类型的序列。
//
//   predicate:
//     测试每个元素是否满足条件的函数。
//
// 类型参数:
//   TSource:
//     序列中元素的类型。
//
// 返回结果:
//     包含输入序列中满足条件的元素的 IEnumerable`1。
//
// 异常:
//   T:System.ArgumentNullException:
//     source 或 predicate 为 null。
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

// 摘要:
//     基于条件过滤序列中的值。每个元素的索引在谓词函数的逻辑中被使用。
//
// 参数:
//   source:
//     要过滤的 IEnumerable`1 类型的序列。
//
//   predicate:
//     测试源元素是否满足条件的函数;函数的第二个参数代表源元素的索引。
//
// 类型参数:
//   TSource:
//     序列中元素的类型。
//
// 返回结果:
//     包含来自输入序列中满足条件的元素的 IEnumerable`1。
//
// 异常:
//   T:System.ArgumentNullException:
//     source 或 predicate 为 null。
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate);

功能

用于过滤集合中的元素,返回一个新的集合,其中包含满足指定条件的所有元素。

详细说明:

该方法适用于所有继承于IEnumerable<TSource>的集合,传入参数为一个Func<TSource, bool> predicate委托,可以是一个参数为TSource类型,返回值为bool的方法或者Lambda表达式;方法返回一个新的IEnumerable<TSource>的集合。

应用实例

查找所有设备类型为“生产设备”的对象
  //Lambda
  var productionDevices = list.Where(device => device.Type == "生产设备");
  
  //方法
  var productionDevices2 = list.Where(ProductDevice);
  
bool ProductDevice(Device device)
{
    return device.Type == "生产设备";
}

结果测试:

将结果打印出来,可以看到上面两种方法效果一致,后续不一一演示两种方法,以Lambda的形式为主。
在这里插入图片描述

运行结果:
在这里插入图片描述

查询所有测试结果大于90的设备
  var device90s = list.Where(device => device.Result >= 90);

在这里插入图片描述

多条件查询:类型为生产设备同时测试结果大于90的设备
var pro90Devices = list.Where(x => x.Type == "生产设备" && x.Result >= 90);

First/FirstOrDefault

功能:

返回集合中的第一个元素,如果集合为空,First 方法会抛出异常,而 FirstOrDefault 会返回该类型的默认值。

示例:

查找id为xxx的设备
  var dev1 = list.First(x => x.Id == 101);
  var dev2 = list.FirstOrDefault(x => x.Id == 101);
  Console.WriteLine("\n单设备查找:");
  Console.WriteLine($"ID: {dev1.Id}, 名称: {dev1.Name}, 结果: {dev1.Result}");
  Console.WriteLine($"ID: {dev2.Id}, 名称: {dev2.Name}, 结果: {dev2.Result}");
查询id大于200的设备
  var dev1 = list.First(x => x.Id > 200);

此时有多个满足的设备,但是他只会返回第一个

在这里插入图片描述

方法区别:

First 方法会抛出异常,而 FirstOrDefault 会返回该类型的默认值。

示例:查找一个不存在的设备
var dev2 = list.FirstOrDefault(x => x.Id == 0);
var dev1 = list.First(x => x.Id == 0);

可以看到使用FirstOrDefault 返回了一个null,也就是这个类型的默认值,而使用First 直接报错了,这个就根据自己需要去使用不同方法

在这里插入图片描述

定义和注释:

// 摘要:
//     返回序列中的第一个元素。
//
// 参数:
//   source:
//     要从中返回第一个元素的 IEnumerable`1 序列。
//
// 类型参数:
//   TSource:
//     序列中元素的类型。
//
// 返回结果:
//     序列中的第一个元素。
//
// 异常:
//   T:System.ArgumentNullException:
//     source 为 null。
//
//   T:System.InvalidOperationException:
//     序列为空。
public static TSource First<TSource>(this IEnumerable<TSource> source);

// 摘要:
//     返回序列中满足指定条件的第一个元素。
//
// 参数:
//   source:
//     要从中返回元素的 IEnumerable`1 序列。
//
//   predicate:
//     测试每个元素是否满足条件的函数。
//
// 类型参数:
//   TSource:
//     序列中元素的类型。
//
// 返回结果:
//     序列中通过指定谓词函数测试的第一个元素。
//
// 异常:
//   T:System.ArgumentNullException:
//     source 或 predicate 为 null。
//
//   T:System.InvalidOperationException:
//     没有元素满足谓词条件。 - 或 - 序列为空。
public static TSource First<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

// 摘要:
//     返回序列中的第一个元素,如果序列不包含元素,则返回默认值。
//
// 参数:
//   source:
//     要从中返回第一个元素的 IEnumerable`1 序列。
//
// 类型参数:
//   TSource:
//     序列中元素的类型。
//
// 返回结果:
//     如果序列为空,则返回 default(TSource);否则,返回序列中的第一个元素。
//
// 异常:
//   T:System.ArgumentNullException:
//     source 为 null。
public static TSource? FirstOrDefault<TSource>(this IEnumerable<TSource> source);

// 摘要:
//     返回序列中的第一个元素,如果序列不包含元素,则返回默认值。
//
// 参数:
//   source:
//     要从中返回第一个元素的 IEnumerable`1 序列。
//
//   defaultValue:
//     序列为空时返回的默认值。
//
// 类型参数:
//   TSource:
//     序列中元素的类型。
//
// 返回结果:
//     如果序列为空,则返回 defaultValue;否则,返回序列中的第一个元素。
//
// 异常:
//   T:System.ArgumentNullException:
//     source 为 null。
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source, TSource defaultValue);

// 摘要:
//     返回序列中满足条件的第一个元素或默认值,如果没有这样的元素则返回默认值。
//
// 参数:
//   source:
//     要从中返回元素的 IEnumerable`1 序列。
//
//   predicate:
//     测验每个元素是否满足条件的函数。
//
// 类型参数:
//   TSource:
//     序列中元素的类型。
//
// 返回结果:
//     如果序列为空或没有任何元素通过谓词测试,则返回 default(TSource);否则,返回序列中通过谓词测试的第一个元素。
//
// 异常:
//   T:System.ArgumentNullException:
//     source 或 predicate 为 null。
public static TSource? FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

// 摘要:
//     返回序列中满足条件的第一个元素或默认值,如果没有这样的元素则返回默认值。
//
// 参数:
//   source:
//     要从中返回元素的 IEnumerable`1 序列。
//
//   predicate:
//     测验每个元素是否满足条件的函数。
//
//   defaultValue:
//     如果序列为空时返回的默认值。
//
// 类型参数:
//   TSource:
//     序列中元素的类型。
//
// 返回结果:
//     如果序列为空或没有任何元素通过谓词测试,则返回 defaultValue;否则,返回序列中通过谓词测试的第一个元素。
//
// 异常:
//   T:System.ArgumentNullException:
//     source 或 predicate 为 null。
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, TSource defaultValue);

All

功能:

检查集合中的所有元素是否都满足指定条件。

示例:

查询是否所有设备都达标(测试结果大于90)
 var result = list.All(x => x.Result > 90);

在这里插入图片描述

Any

功能:

检查集合中是否至少有一个元素满足指定条件。

示例:

查询是否有大于等于一个设备都达标(测试结果大于90)

var result2 = list.Any(x => x.Result > 90);

在这里插入图片描述

Count

功能:

返回满足指定条件的元素数量。

示例:

获集合数量

不加任何参数就是返回集合中对象的数量

 var count = list.Count();
获取生产设备的数量
var count2 = list.Count(device => device.Type == "生产设备");

在这里插入图片描述

总结

看了上面这些示例,可以发现,有些查询条件都是类似的,不同方法,用法都是一样的,属于一个类似if中的判断表达式,作为Lambda表达式主体,就可以达到效果,不同的方法就是查询的结果和功能不同。

完整示例

这些方法在处理集合时非常有用,特别是当你需要对集合进行条件筛选、查找单个元素或者统计信息时。

下面是使用这些方法的完整示例:

 internal class Program
 {
     static void Main(string[] args)
     {
         Console.WriteLine("Hello, World!");

         List<Device> list = new List<Device>();
         list.Add(
             new Device()
             {
                 Id = 101,
                 Name = "1号设备",
                 Type = "生产设备",
                 Result = 99
             }
         );
         list.Add(
             new Device()
             {
                 Id = 102,
                 Name = "2号设备",
                 Type = "生产设备",
                 Result = 60
             }
         );
         list.Add(
             new Device()
             {
                 Id = 103,
                 Name = "3号设备",
                 Type = "测试设备",
                 Result = 98
             }
         );
         list.Add(
             new Device()
             {
                 Id = 104,
                 Name = "4号设备",
                 Type = "测试设备",
                 Result = 70
             }
         );
         list.Add(
             new Device()
             {
                 Id = 201,
                 Name = "5号生产设备",
                 Type = "生产设备",
                 Result = 100
             }
         );
         list.Add(
             new Device()
             {
                 Id = 202,
                 Name = "6号测试设备",
                 Type = "测试设备",
                 Result = 89
             }
         );
         list.Add(
             new Device()
             {
                 Id = 203,
                 Name = "7号测试设备",
                 Type = "测试设备",
                 Result = 98
             }
         );
         list.Add(
             new Device()
             {
                 Id = 204,
                 Name = "8号测试设备",
                 Type = "测试设备",
                 Result = 95
             }
         );
         // 使用LINQ查询方法

         // 1. 选择所有设备名称
         var deviceNames = list.Select(device => device.Name);
         // 输出结果
         Console.WriteLine("\n所有设备名称:");
         foreach (var name in deviceNames)
         {
             Console.WriteLine(name);
         }

         // 过滤生产设备
         var productionDevices = list.Where(device => device.Type == "生产设备");
         var productionDevices2 = list.Where(ProductDevice);

         Console.WriteLine("\n生产设备:");
         foreach (var device in productionDevices)
         {
             Console.WriteLine($"ID: {device.Id}, 名称: {device.Name}, 结果: {device.Result}");
         }

         Console.WriteLine("\n生产设备:");
         foreach (var device in productionDevices2)
         {
             Console.WriteLine($"ID: {device.Id}, 名称: {device.Name}, 结果: {device.Result}");
         }

         //Where
         var device90s = list.Where(device => device.Result >= 90);
         Console.WriteLine("\n生产合格设备:");
         foreach (var device in device90s)
         {
             Console.WriteLine($"ID: {device.Id}, 名称: {device.Name}, 结果: {device.Result}");
         }

         var pro90Devices = list.Where(x => x.Type == "生产设备" && x.Result >= 90);

         //First/FirstOrDefault

         var dev1 = list.First(x => x.Id == 101);
         var dev2 = list.FirstOrDefault(x => x.Id == 101);
         //var dev1 = list.First(x => x.Id == 0);  //报错
         //var dev2 = list.FirstOrDefault(x => x.Id == 0);
         //var dev1 = list.First(x => x.Id > 200);
         //var dev2 = list.FirstOrDefault(x => x.Id > 200);
         Console.WriteLine("\n单设备查找:");
         Console.WriteLine($"ID: {dev1.Id}, 名称: {dev1.Name}, 结果: {dev1.Result}");
         Console.WriteLine($"ID: {dev2.Id}, 名称: {dev2.Name}, 结果: {dev2.Result}");

         Console.WriteLine("\n All方法测试");
         var result = list.All(x => x.Result > 90);
         Console.WriteLine($"result: {result}");

         Console.WriteLine("\n Any方法测试");
         var result2 = list.Any(x => x.Result > 90);
         Console.WriteLine($"result: {result2}");

         Console.WriteLine("\nCount方法示例");
         var count = list.Count();
         var count2 = list.Count(device => device.Type == "生产设备");
         Console.WriteLine($"count: {count}");
         Console.WriteLine($"count2: {count2}");
     }

     static bool ProductDevice(Device device)
     {
         return device.Type == "生产设备";
     }
 }

 /// <summary>
 /// 设备类
 /// </summary>
 class Device
 {
     /// <summary>
     /// Id
     /// </summary>
     public int Id { get; set; }

     /// <summary>
     /// 设备类型
     /// </summary>
     public string Type { get; set; }

     /// <summary>
     /// 名称
     /// </summary>
     public string Name { get; set; }

     /// <summary>
     /// 测试结果
     /// </summary>
     public int Result { get; set; }
 }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

# RocketMQ 实战:模拟电商网站场景综合案例(六)

RocketMQ 实战&#xff1a;模拟电商网站场景综合案例&#xff08;六&#xff09; 一、RocketMQ 实战 &#xff1a;项目公共类介绍 1、ID 生成器 &#xff1a;IDWorker&#xff1a;Twitter 雪花算法。 在 shop-common 工程模块中&#xff0c;IDWorker.java 是 ID 生成器公共类…

Centos7系统下Docker的安装与配置

文章目录 前言下载Docker安装yum库安装Docker启动和校验配置Docker镜像加速卸载Docker 前言 此博客的内容的为自己的学习笔记&#xff0c;如果需要更具体的内容&#xff0c;可查看Docker官网文档内容 注意&#xff1a;以下命令在root管理员用户下运行&#xff0c;如果在普通用…

基于单片机的无线遥控自动翻书机械臂设计

摘 要&#xff1a; 本设备的重点控制部件为单片机&#xff0c;充分实现了其自动化的目的。相关研究表明&#xff0c;它操作简单便捷&#xff0c;使残疾人在翻书时提供了较大的便利&#xff0c;使用价值性极高&#xff0c;具有很大的发展空间。 关键词&#xff1a; 机械臂&…

gbase8s数据库阻塞检查点和非阻塞检查点的执行机制

1. 检查点的描述 为了便于数据库系统的复原和逻辑恢复&#xff0c;数据库服务器生成的一致性标志点&#xff0c;称为检查点&#xff0c;其是建立在数据库系统的已知和一致状态时日志中的某个时间点检查点的目的在于定期将逻辑日志中的重新启动点向前移动 如果存在检查点&#…

零基础入门学用Arduino 第三部分(二)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

即时聊天系统

功能描述 该项目是一个前后端分离的即时聊天项目&#xff0c;前端采用vue2、后端使用springboot以mysql8.0作为数据库。 项目功能包含了单聊、群聊功能。在此基础上增加了对好友的功能操作&#xff0c;如备注设为通知、视频聊天、语音聊天、置顶、拉入黑名单、清空聊天记录等。…

如何在两个不同的conda环境中实现jupyter notebook共同使用,避免重复下载

前提&#xff1a;有2个conda环境&#xff0c;yes和py38_pytorch 其中&#xff0c;yes已经安装了jupyter notebook;py38_pytorch没有jupyter notebook 现在&#xff0c;实现在py38_pytorch用jupyter notebook 步骤&#xff1a; 1、激活py38_pytorch conda activate py38_p…

gma 2.0.10 (2024.06.16) | GmaGIS V0.0.0a4 更新日志

安装 gma 2.0.10 pip install gma2.0.10网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码&#xff1a;1pc8 注意&#xff1a;此版本没有Linux版&#xff01; 编译gma的Linux虚拟机没有时间修复&#xff0c;本期Linux版…

HTML5的未来:掌握最新技术,打造炫酷网页体验

引言 随着互联网技术的飞速发展&#xff0c;HTML5已经成为构建现代网页和应用的核心技术之一。HTML5不仅提供了丰富的语义化标签&#xff0c;还引入了多项前沿技术&#xff0c;使得网页体验更加丰富多彩。本文将探讨HTML5的最新技术&#xff0c;并结合行业实践&#xff0c;提供…

基础算法--双指针算法

文章目录 什么是双指针算法例题1.移动零2.复写零3.快乐数4.盛最多水的容器5.有效三角形的个数6.三数之和7.四数之和 什么是双指针算法 通常我们讲的双指针就是用两个指针&#xff0c;两个指针可以是快慢指针&#xff0c;解决成环的问题&#xff0c;也可以是指向收尾的两个指针…

快速压缩前端项目

背景 作为前端开发工程师难免会遇到需要把项目压缩成压缩文件来传送的情况&#xff0c;这时候需要压缩软件进行压缩文件处理 问题 项目中的依赖包文件非常庞大&#xff0c;严重影响压缩速度&#xff0c;即使想先删除再压缩&#xff0c;删除文件也不会很快完成 解决 首先要安…

Unity中实现ScrollRect 滚动定位到视口内

Demo链接: https://download.csdn.net/download/qq_41973169/89439428https://download.csdn.net/download/qq_41973169/89439428 一、前言 Unity版本:2020.1.x 如果需要资源请联系我我会分享给你 因为本人也要存储一下Demo所以上传到这里了但是又不能设置不需要积分 在Un…

零基础直接上手java跨平台桌面程序,使用javafx(六)查询sqlite数据显示到TableView中

我们使用jdbc查询sqlite的一个表显示到TableView中 在hello-view的onMouseClicked里面填上“openclick2”&#xff0c;然后在HelloController写上openclick2的相关代码FXML protected void openclick2() { }。我们要先配置好sqlite的jdbc驱动&#xff08;略&#xff09;。openc…

【34W字CISSP备考笔记】域1:安全与风险管理

1.1 理解、坚持和弘扬职业道德 1.1.1.(ISC)职业道德规范 1、行为得体、诚实、公正、负责、守法。 2、为委托人提供尽职、合格的服务。 3、促进和保护职业。 4、保护社会、公益、必需的公信和自信&#xff0c;保护基础设施。 1.1.2.组织道德规范 1、RFC 1087 &#xff0…

[大模型]XVERSE-7B-chat WebDemo 部署

XVERSE-7B-Chat为XVERSE-7B模型对齐后的版本。 XVERSE-7B 是由深圳元象科技自主研发的支持多语言的大语言模型&#xff08;Large Language Model&#xff09;&#xff0c;参数规模为 70 亿&#xff0c;主要特点如下&#xff1a; 模型结构&#xff1a;XVERSE-7B 使用主流 Deco…

HTML静态网页成品作业(HTML+CSS+JS)——游戏天天酷跑网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片切换轮播&#xff0c;共有4个页面。 二、…

怎么找抖音视频素材?在哪里找爆款热门的素材呢?

在短视频时代&#xff0c;拍摄和分享短视频已经成为一种潮流。但是&#xff0c;许多人都会面临一个问题&#xff0c;那就是——视频素材从哪里来&#xff1f;今天&#xff0c;我将为大家介绍几个优质的网站&#xff0c;让你的视频素材不再愁。 蛙学府&#xff1a;https://www.…

自动化测试git的使用

git是一款分布式的配置管理工具。本文主要讲git如何在自动化测试中安装&#xff0c;上传及拉取下载代码。 1 、git 介绍 每天早上到公司&#xff0c;从公司的git服务器上下载最新的代码&#xff0c;白天在最新的代码基础上&#xff0c;编写新的代码&#xff0c;下班时把“代码…

有趣网站推荐-Rainymood

听着下雨声&#xff0c;内心会平静许多&#xff0c;不知道你是否会有这种感受。 下雨声可以帮助人们放松神经&#xff0c;专注思考&#xff0c;或者只是享受一段安静的时刻&#xff0c;在繁忙的工作和生活间隙。 本期推荐网站Rain Mood 干净简洁的网站&#xff0c;只为听雨声…

C# Winform Chart图表使用和详解

Chart控件是微软自带的一种图形可视化组件&#xff0c;能展示种类丰富的图表形式。如曲线图&#xff0c;折线图&#xff0c;饼状图&#xff0c;环形图&#xff0c;柱状图&#xff0c;曲线面积图。 实例代码链接&#xff1a;https://download.csdn.net/download/lvxingzhe3/8943…