C#开发-集合使用和技巧(七)分组方法GroupBy的使用

介绍

GroupBy 是 C# 中的一个 LINQ 扩展方法,用于根据指定的键将序列中的元素分组。它可以根据提供的键函数将数据分割成多个组,每组包含具有相同键的元素。

GroupBy也是一个在集合用比较常用的方法,也是比较好用的,适用于对序列中的元素进行分组,他有多种重载,可以实现不同的功能,具体定义如下:

他有多种重载,具体定义如下:

定义说明
GroupBy<TSource,TKey,TElement,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>, Func<TKey,IEnumerable<TElement>,TResult>)根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。 通过使用指定的函数对每个组的元素进行投影。
GroupBy<TSource,TKey,TElement,TResult>(IEnumerable<TSource>, Func<TSource, TKey>, Func<TSource,TElement>, Func<TKey,IEnumerable<TElement>, TResult>, IEqualityComparer<TKey>)根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。 通过使用指定的比较器对键值进行比较,并且通过使用指定的函数对每个组的元素进行投影。
GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>)根据指定的键选择器函数对序列中的元素进行分组,并且通过使用指定的函数对每个组中的元素进行投影。
GroupBy<TSource,TKey,TElement>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TSource,TElement>, IEqualityComparer<TKey>)根据键选择器函数对序列中的元素进行分组。 通过使用比较器对键进行比较,并且通过使用指定的函数对每个组的元素进行投影。
GroupBy<TSource,TKey,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TKey,IEnumerable<TSource>,TResult>)根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。
GroupBy<TSource,TKey,TResult>(IEnumerable<TSource>, Func<TSource,TKey>, Func<TKey,IEnumerable<TSource>,TResult>, IEqualityComparer<TKey>)根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。 通过使用指定的比较器对键进行比较。
GroupBy<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>)根据指定的键选择器函数对序列中的元素进行分组。
GroupBy<TSource,TKey>(IEnumerable<TSource>, Func<TSource,TKey>, IEqualityComparer<TKey>)根据指定的键选择器函数对序列中的元素进行分组,并使用指定的比较器对键进行比较。

使用

测试数据

定义 一个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 });

分组用法

根据某一属性的值进行分组

示例:

根据设备的类型进行分组

    var groups = list.GroupBy(x => x.Type);
    foreach (var group in groups)
    {
        Console.WriteLine(group.Key);
        foreach (var item in group)
        {
            Console.WriteLine(
                $"ID:{item.Id},Name:{item.Name},Type:{item.Type},Result:{item.Result}"
            );
        }
    }

在这里插入图片描述

根据判断条件进行分组

这个最终分组是True和False两个组

示例:

以测试结果大于90为合格,分成合格和不合格两个组

 var groups2 = list.GroupBy(x => x.Result > 90);
 foreach (var group in groups2)
 {
     Console.WriteLine(group.Key);
     foreach (var item in group)
     {
         Console.WriteLine(
             $"ID:{item.Id},Name:{item.Name},Type:{item.Type},Result:{item.Result}"
         );
     }
 }

结果:

在这里插入图片描述

分组数据处理

可以用GroupBy直接处理分组数据,并转换成新的类

示例

获取组的数量,最大值,最小值等等

var group3 = list.GroupBy(
    item => item.Result / 10,
    pet => pet.Result,
    (baseResult, results) =>
        new
        {
            Key = baseResult,
            Count = results.Count(),
            Min = results.Min(),
            Max = results.Max(),
        }
);

foreach (var group in group3)
{
    Console.WriteLine($"Group:{group.Key * 10}--{group.Key * 10 + 9}");
    Console.WriteLine($"Count:{group.Count}");
    Console.WriteLine($"Min:{group.Min}");
    Console.WriteLine($"Max:{group.Max}");
    Console.WriteLine();
}

效果:

在这里插入图片描述

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

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

相关文章

前端技术栈二(promise模块化编程)

一、promise 1 Promise 基本介绍 传统的 Ajax 异步调用在需要多个操作的时候&#xff0c;会导致多个回调函数嵌套&#xff0c;导致代码不够直观&#xff0c;就是常说的 Callback Hell 为了解决上述的问题&#xff0c;Promise 对象应运而生&#xff0c;在 EMCAScript 2015 当中…

【MySQL连接器(Python)指南】02-MySQL连接器(Python)版本与实现

文章目录 前言MySQL连接器(Python)版本MySQL连接器(Python)实现总结前言 MySQL连接器(Python),用于让Python程序能够访问MySQL数据库。要想让Python应用程序正确高效地使用MySQL数据,就需要深入了解MySQL连接器的特性和使用方法。 MySQL连接器(Python)版本 下表总结了可用的…

java 不可变集合的创建和Stream流的使用

文章目录 一、创建不可变的集合1.1为什么创建不可变的集合1.2 创建List、Set和Map的不可变集合1.2.1 创建List的不可变集合1.2.2 创建Set 的不可变集合1.2.3 创建Map的不可变集合 二、使用集合 的Stream 流2.1 Stream的使用步骤2.2 Stream的方法 三、如何获取Stream 流对象四、…

【PyQt5】python可视化开发:PyQt5介绍,开发环境搭建快速入门

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

shop APP UI

APP和微信小程序不一样&#xff0c; APP的客户端需要两个(一个安卓&#xff0c;一个苹果IOS); APP的服务端需要&#xff08;管理端后台&#xff0c;接口&#xff09;&#xff1b;

qml:导入B站Up主的FluentUI插件

文章目录 文章介绍如何加载1、下载代码2、官方文档和组件介绍 运行FluentUI新建自己的qml项目&#xff0c;并导入FluentUI 文章介绍 up主“会磨刀的小猪”模仿微软Fluent风格写的界面&#xff0c;可以理解为用qt和qml写出的win10/win11风格的界面&#xff0c;比原本的qt风格好…

uni-app 表格tr添加点击事件

首先找到uni.tr这个组件的页面&#xff0c;路径uni_modules/uni-table/components/uni-tr/uni-tr.vue 然后添加点击事件 在你的表格页面就可以添加点击事件了

【Java】已解决java.util.concurrent.TimeoutException异常

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.util.concurrent.TimeoutException异常 一、问题背景 java.util.concurrent.TimeoutException是Java并发编程中常见的一个异常&#xff0c;它通常发生在使用Future或Future…

基于Java的高校校园点餐系统

开头语&#xff1a; 你好&#xff0c;我是计算机专业的学长&#xff0c;如果你对高校校园点餐系统感兴趣或有相关开发需求&#xff0c;欢迎联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;Eclipse、Tomcat 系统展示…

网络校时服务器:铁路对时有妙招

在信息高速发展的今天&#xff0c;铁路作为国家的经济大动脉&#xff0c;与广大市民生活息息相关&#xff0c;担负着运送大流量乘客、保证交通畅通的重任&#xff0c;为了保证列车的正点运行和乘客的行程&#xff0c;对时间精准度的要求是非常严格的。随着我国铁路的发展速度和…

WPF三方UI库全局应用MessageBox样式(.NET6版本)

一、问题场景 使用HandyControl简写HC 作为基础UI组件库时&#xff0c;希望系统中所有的MessageBox 样式都使用HC的MessageBox&#xff0c;常规操作如下&#xff1a; 在对应的xxxx.cs 顶部使用using 指定特定类的命名空间。 using MessageBox HandyControl.Controls.Message…

华为---OSPF多区域配置(二)

9.2 OSPF多区域配置 9.2.1 原理概述 在OSPF单区域中&#xff0c;每台路由器都需要收集其他所有路由器的链路状态信息&#xff0c;如果网络规模不断扩大&#xff0c;链路状态信息也会随之不断增多&#xff0c;这将使得单台路由器上链路状态数据库非常庞大&#xff0c;导致路由…

基于Pytorch框架的深度学习Swin-Transformer神经网络食物分类系统源码

第一步&#xff1a;准备数据 5种鸟类数据&#xff1a;self.class_indict ["苹果派", "猪小排", "果仁蜜饼", "生牛肉薄片", "鞑靼牛肉"] &#xff0c;总共有5000张图片&#xff0c;每个文件夹单独放一种数据 第二步&…

期望28K,5.14日蚂蚁java社招一面(杭州)

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 1、线程池的几个参数&#xff1f; 2、一道关于线程池的代码题目&#xff0c;数据库中存任务&#xff0c;通过一个有10个核心线程和无限队列的线程池…

基于springboot实现宠物商城网站管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现宠物商城网站管理系统演示 摘要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;商品信息因为其管理内容繁杂&#xff…

C#.Net筑基-类型系统②常见类型

01、结构体类型Struct 结构体 struct 是一种用户自定义的值类型&#xff0c;常用于定义一些简单&#xff08;轻量&#xff09;的数据结构。对于一些局部使用的数据结构&#xff0c;优先使用结构体&#xff0c;效率要高很多。 可以有构造函数&#xff0c;也可以没有。因此初始…

数据结构:4.1.2二叉搜索树的插入

整个框架和FInd函数的实现是一样的&#xff0c;但是也有不同&#xff08;注意&#xff09; 35>30 向30的右子树 35<41 向41的左子树 35>33 向33的右子树&#xff0c;但33右边为空&#xff0c;所以35就挂在33的右边 因为要把35挂在33的右边&#xff0c;所以要把33的…

前端路线指导(2):前端基础版学习路线

前端基础路线的细节&#xff1a; 哈喽大家好&#xff01;我是小粉&#xff0c;双一流本科 自学前端一年&#xff0c;收获腾讯&#xff0c;字节等9家互联网大厂offer&#xff0c;秋招面试通过率100%&#xff0c;其中半数offer为ssp&#xff08;薪资最高档&#xff09; 以下是我根…

Houdini到UE地形流程

目录 Houidni地形制作 UE地形设置 Houdini engine插件安装 B站参考视频 Houidni地形制作 使用Terrain的HeightField相关节点制作地形&#xff1b;设置地形相关的材质层&#xff08;如rock、soil、grass等&#xff09;&#xff0c;注意材质的重叠&#xff1b; //detail层级&…

Stable Diffusion 3 大模型文生图实践

windows教程2024年最新Stable Diffusion本地化部署详细攻略&#xff0c;手把手教程&#xff08;建议收藏!!)_stable diffusion 本地部署-CSDN博客 linux本地安装教程 1.前期准备工作 1&#xff09;创建conda环境 conda create --name stable3 python3.10 2&#xff09;下…