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

news2024/11/25 18:55:09

集合中常用的查询方法

  • 测试数据准备:
  • 查询方法详解
    • **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; }
 }

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

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

相关文章

2023年的Top20 AI应用在近一年表现怎么样?

AI应用现在进入寒武纪大爆发时代&#xff0c;百花争艳。如果倒回到2023年初&#xff0c;那时候排名靠前的AI应用在一年多时间&#xff0c;发生了哪些变化&#xff1f;能带给我们什么启示&#xff1f; 在2023年1月&#xff0c;排名靠前20的AI应用是&#xff1a; DeepL&#xff…

datax图形化界面datax-web安装及使用

环境准备&#xff1a;需要先安装git和maven git安装可参考git的安装-CSDN博客 maven只需解压安装包&#xff0c;配置环境变量即可使用 1 源代码下载 直接从Git上面获得datax-web源代码 git clone https://gitee.com/WeiYe-Jing/datax-web.git 2 打包项目 进入项目源码根…

Spring底层架构核心概念解析

BeanDefinition BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点.比如: beanClass:表示Bean类型scope:表示Bean作用域,单例/原型等lazyInit:表示Bean是否懒加载initMethodName:表示Bean初始化时要执行的方法destoryMethodName:表示Bean销毁时…

用于每个平台的最佳WordPress LMS主题

你已选择在 WordPress 上构建学习管理系统 (LMS)了。恭喜&#xff01; 你甚至可能已经选择了要使用的 LMS 插件&#xff0c;这已经是成功的一半了。 现在是时候弄清楚哪个 WordPress LMS 主题要与你的插件配对。 我将解释 LMS 主题和插件之间的区别&#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…

车载网络安全指南 软件层面开发阶段(八)

返回总目录->返回总目录<- 目录 前言 一、软件层面产品开发启动 二、确定网络安全需求 三、软件架构设计 四、软件层面漏洞分析 五、软件单元设计和实现 六、软件实现的分析与评估 七、软件单元测试 八、软件集成和测试 九、网络安全验证 十、细化网络安全评估…

发布自己的c#包到nuget

1)创建自己的nuget账号 NuGet Gallery | Home 2)在Rider中-->项目邮件-->properties 注意&#xff1a;必须勾选生成nuget包 3)编译后&#xff0c;将生成一个包 4)点击上传包 5)将之前的nuget包拖拽过来&#xff0c;点击上传即可&#xff0c;如果有不对的比如&#xf…

C++ 43 之 自增运算符的重载

#include <iostream> #include <string> using namespace std;class MyInt{friend ostream& operator<< (ostream& cout , MyInt& int1); public:MyInt(){this->m_num 0;}// 前置自增&#xff1a; 成员函数实现运算符的重载 返回的是 引用&a…

Android 蓝牙配对Settings应用里面的简要流程记录

Android 蓝牙配对Settings应用里面的简要流程记录 文章目录 Android 蓝牙配对Settings应用里面的简要流程记录一、前言二、Settings蓝牙配对的关键代码1、接收蓝牙请求的地方 AndroidManifest.xml2、BluetoothPairingRequest3、BluetoothPairingService4、BluetoothPairingDial…

石头、剪子、布小游戏图形化

石头、剪子、布小游戏图形化 也是之前编写了一个石头、剪子、布的小游戏&#xff0c;总感觉界面不够友好&#xff0c;AI时代到来&#xff0c;一切都无所不能&#xff0c;而且编程效率大大提高了。所以用AI大模型进行程序代码重构&#xff0c;再稍加修改&#xff0c;效果还不错…

LLM proj - 审稿大模型

常用数据处理 主要是四种方式&#xff1a;正则表达式、AC自动机、困惑度过滤低质文本、最小哈希算法实现文本去重 1. 正则表达式&#xff0c;去做一些模式匹配 ex&#xff1a; # 论文的评审内容有时会存在大量列举reference&#xff08;参考文献&#xff09;的情况 # 这些r…

KKT基础知识

KKT条件定义 KKT条件(Karush–Kuhn–Tucker conditions)是最优化&#xff08;特别是非线性规划&#xff09;领域最重要的成果之一&#xff0c;是判断某点是极值点的必要条件。 最优化问题 要选择一组参数&#xff08;变量&#xff09;&#xff0c;在满足一定的限制条件&…

Unity动态添加聊天文本

1.创建一个滚动视图 2.调整滚动视图的位置并删掉这个 3.创建一个输入框和一个按钮 这里插一句一定要给content添加这个组件并设置单元格大小 4创建一个脚本并编写下面代码 using System.Collections; using System.Collections.Generic; using TMPro; using Unity.VisualScrip…

⭐Unity 控制任意UI的渐隐渐显

使用脚本之前先给要控制的UI加上CanvasGroup组件 解释: 这个脚本使用协程来逐渐改变CanvasGroup的alpha值&#xff0c;从而实现渐隐和渐显的效果。 Mathf.Lerp函数用于在指定的时间内平滑地从当前透明度过渡到目标透明度。 通过调用FadeIn和FadeOut方法&#xff0c;你可以在任…

人工智能在风险管理中的创新之路及案例分析

随着科技的日新月异&#xff0c;人工智能&#xff08;AI&#xff09;技术已广泛应用于各个领域&#xff0c;特别是在风险管理方面&#xff0c;其展现出的巨大潜力和实际应用价值引人瞩目。本文将结合具体案例&#xff0c;深入探讨AI在风险管理中的创新应用及其带来的行业变革。…

FANUC机器人SRVO-454和SRVO-455故障报警处理总结

FANUC机器人SRVO-454和SRVO-455故障报警处理总结 公司内的一台FANUC机器人(型号:M-900iB;控制柜型号:R-30iB)正常运转过程中突然报警: SRVO-455 CPU看门狗(G:1 A:2),按Reset键无法消除该报警; 查看SRVO-455故障报警的具体内容,如下图所示: 由于现场没有备用的伺服放…

ubuntu 22.04下利用webmin 搭建一个Wordpress 网站(2)

上次我们讲到第二部分&#xff0c;今天我们继续这一个话题 第三部分&#xff1a;利用webmin创建一个wordpress网站 1、在 Webmin 内安裝Apache 未使用的模块> Apache Webserver > 现在安装 会出现如下图所示的有关软件 刷新模快后 检查开机时要自动启动Apache 测…

Midjourney提示词终极指南(完整版)

在这篇博客中&#xff0c;我们深入研究了使用提示的艺术&#xff0c;以利用Midjourney的AI功能的力量。我们将探索各种技术&#xff0c;以创建个性化和迷人的图像&#xff0c;将你的创意想法转变为令人惊叹的视觉杰作。 1. 了解提示词 提示是简短的文字描述或关键词&#xff…

JavaScript——初识:JavaScript的组成、输入和输出语句... | JavaScript基础:变量,数据类型转换

目录 初识JavaScript JavaScript的组成 输入和输出语句 ECMAScript 6保留关键字 变量的命名规范 注意事项 JavaScript基础 变量的数据类型 数据类型分类 数据类型转换 转换为字符串型 转换为数字型 转换为布尔型 例题 初识JavaScript JavaScript的组成 Java…

SpringAI快速上手

一、导入依赖 镜像&#xff08;导入maven依赖&#xff09; <repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>…