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

C# linq 根据多字段动态Group by

实现类: 

public static class LinqHepler
{/// <summary>/// 根据单个字段动态Group/// </summary>/// <typeparam name="T"></typeparam>/// <param name="source"></param>/// <param name="propertyName"></param>/// <returns></returns>public static IEnumerable<IGrouping<object, T>> GroupByDynamic<T>(this IEnumerable<T> source, string propertyName){var parameter = Expression.Parameter(typeof(T), "p");var property = Expression.Property(parameter, propertyName);var lambda = Expression.Lambda(typeof(Func<T, object>), Expression.Convert(property, typeof(object)), parameter);var groupByMethod = typeof(Enumerable).GetMethods().Where(m => m.Name == "GroupBy" && m.GetParameters().Length == 2).First();var groupBy = groupByMethod.MakeGenericMethod(typeof(T), typeof(object));return (IEnumerable<IGrouping<object, T>>)groupBy.Invoke(null, new object[] { source, lambda.Compile() });}/// <summary>/// 多字段动态GroupBy/// </summary>/// <typeparam name="T">需要重写GetHashCode和Equals方法, 因为类是比较引用的,而常用于GroupBy操作的匿名类是比较值的</typeparam>/// <param name="source"></param>/// <param name="propertyNames"></param>/// <returns></returns>public static IEnumerable<IGrouping<T, T>> GroupByDynamic<T>(this IEnumerable<T> source, List<string> propertyNames) where T : class{if(propertyNames.IsNullOrEmpty())throw new ArgumentNullException("propertyNames");var parameter = Expression.Parameter(typeof(T), "p");var lambda = BuildSelector<T>(parameter, propertyNames);var groupByMethod = typeof(Enumerable).GetMethods().Where(m => m.Name == "GroupBy" && m.GetParameters().Length == 2).First();var groupBy = groupByMethod.MakeGenericMethod(typeof(T), typeof(T));return (IEnumerable<IGrouping<T, T>>)groupBy.Invoke(null, new object[] { source, lambda });}private static Func<T, T> BuildSelector<T>(ParameterExpression param, List<string> propertyNames){var memberBindings = new List<MemberBinding>(propertyNames.Count);foreach (var propertyName in propertyNames){var expressionProperty = Expression.Property(param, propertyName);memberBindings.Add(Expression.Bind(typeof(T).GetProperty(propertyName), expressionProperty));}var memberInit = Expression.MemberInit(Expression.New(typeof(T)), memberBindings);var lambda = Expression.Lambda<Func<T, T>>(memberInit, param);return lambda.Compile();}
}

使用方式:

var people = new List<Person>
{new Person { Name = "Alice",Six="男", Age = 30 },new Person { Name = "Alice",Six="男", Age = 20 },new Person { Name = "Bob",Six="男", Age = 30 },new Person { Name = "Bob",Six="男", Age = 25 },new Person { Name = "Charlie",Six="男", Age = 25 },new Person { Name = "Charlie",Six="男", Age = 25 }
};var groupFileds = new List<string>() { "Name", "Six" };
var groupedByName = people.GroupByDynamic(groupFileds).Select(t =>{var model = new Person(){Name = t.First().Name,Six = t.First().Six,Age = t.Sum(p => p.Age),Details = t.ToList(),};return model;}).ToList();
//需要重写GetHashCode和Equals方法, 因为类是比较引用的,而常用于GroupBy操作的匿名类是比较值的public class Person{public string? Name { get; set; }public string? Six { get; set; }public int Age { get; set; }public override int GetHashCode(){return $"{Name},{Six},{Age}".GetHashCode(); //需要用来分组的字段,或者全部字段}public override bool Equals(object? obj){if (obj == null)return false;if(!(obj is Person))return false;return this.GetHashCode() == obj.GetHashCode();}}

相关文章:

C# linq 根据多字段动态Group by

实现类&#xff1a; public static class LinqHepler {/// <summary>/// 根据单个字段动态Group/// </summary>/// <typeparam name"T"></typeparam>/// <param name"source"></param>/// <param name"prop…...

C语言学习/复习22----阶段测评编程题

一、阶段测评练习 题1&#xff1a; 题2&#xff1a;...

LeetCode-1766. 互质树【树 深度优先搜索 广度优先搜索 数组 数学 数论】

LeetCode-1766. 互质树【树 深度优先搜索 广度优先搜索 数组 数学 数论】 题目描述&#xff1a;解题思路一&#xff1a;DFS 中记录节点值的深度和编号&#xff0c;回溯写法。关键点是1 < nums[i] < 50解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1…...

“数据安全服务能力”评定资格认证!不容错过

数据安全服务能力评定是指对数据安全服务提供商从事数据安全服务综合能力的评定&#xff0c;包括技术能力、服务能力、质量保证能力、人员构成与素质、经营业绩、资产状况等要素。 一、能力评定类型与等级 数据安全服务能力分为二个类型&#xff1a;数据安全评估、数据安全建…...

【MATLAB 分类算法教程】_3麻雀搜索算法优化支持向量机SVM分类 - 教程和对应MATLAB代码

分类代码案例3:麻雀搜索算法优化支持向量机SVM分类 - MATLAB完全代码教程 1. 初始化代码2.读取数据代码3.数据预处理代码4.利用麻雀搜索算法SSA求解最佳的SVM参数c和g代码5.根据最佳的参数进行SVM模型训练代码6.SVM模型预测代码7.准确率分析以及分类结果对比作图代码本文以红酒…...

利用机器学习库做动态定价策略的例子

动态定价是一个复杂的问题&#xff0c;涉及到市场需求、库存、竞争对手行为、季节性因素等多个变量。在实际应用中&#xff0c;动态定价通常需要复杂的模型和大量的数据分析。我选择使用Python&#xff08;Golearn库&#xff09;进行机器学习模型的训练和部署&#xff0c;而将G…...

Tcpdump -r 解析pcap文件

当我们使用命令抓包后&#xff0c;想在命令行直接读取筛选怎么办&#xff1f;-r参数就支持了这个 当你使用 tcpdump 的 -r 选项读取一个之前捕获的数据包文件&#xff0c;并想要筛选指定 IP 地址和端口的包时&#xff0c;你可以在命令中直接加入过滤表达式。这些过滤表达式可以…...

[dvwa] sql injection(Blind)

blind 0x01 low 1’ and length(version()) 6 # syntax: substr(string , from<start from 1>, cut length) 1’ and substr(version(),1,1) ‘5’ # 1’ and substr(version(),2,1) ‘.’ # 1’ and substr(version(),3,1) ‘7’ # 1’ and substr(version(),4,…...

linux 挂载云盘 NT只能挂载2T,使用parted挂载超过2T云盘

一、删除原来挂载好的云盘和分区 1、查看挂载号的云盘 fdisk -l 发现我们有5千多G但是只挂载了2T&#xff0c;心里非常的慌张&#xff01;十分的不爽&#xff01; 好&#xff0c;我们把它干掉&#xff0c;重新分区&#xff01; 2、解除挂载 umount /homeE 没保存跳转到&…...

用Skimage学习数字图像处理(021):图像特征提取之线检测(下)

本节是特征提取之线检测的下篇&#xff0c;讨论基于Hough变换的线检测方法。首先简要介绍Hough变换的基本原理&#xff0c;然后重点介绍Skimage中含有的基于Hough变换的直线和圆形检测到实现。 目录 10.4 Hough变换 10.4.1 原理 10.4.2 实现 10.4 Hough变换 Hough变换&…...

ArduPilot飞控之Gazebo + SITL + MP的Jetson Orin环境搭建

ArduPilot飞控之Gazebo SITL MP的Jetson Orin环境搭建 1. 源由2. Linux环境整理3. 安装Gazebo环境3.1 安装Gazebo3.2 安装插件3.3 配置插件3.4 测试Gazebo 4. 安装Arudpilot-SITL环境4.1 克隆工程4.2 编译准备4.3 环境配置4.4 配置编译4.5 测试运行 5. 测试运行6. 参考资料 1…...

前端错误监控的方法有哪些

前端错误监控是指通过各种手段收集、分析和处理前端应用运行中发生的错误 常用的前端错误监控的方法有 使用 try catch 方法 捕获特定代码块中的错误多用于处理特定函数或代码段可能抛出的异常&#xff0c;尤其是异步代码网络请求错误监控 promise.catchtry catch全局错误处理…...

✌粤嵌—2024/3/11—跳跃游戏

代码实现&#xff1a; 方法一&#xff1a;递归记忆化 int path; int used[10000];bool dfs(int *nums, int numsSize) {if (path numsSize - 1) {return true;}for (int i 1; i < nums[path]; i) {if (used[path i]) {continue;}path i;used[path] 1;if (dfs(nums, num…...

Docker入门实战教程

文章目录 Docker引擎的安装Docker比vm虚拟机快 Docker常用命令帮助启动类命令镜像命令docker imagesdocker searchdocker pulldocker system dfdocker rmi 容器命令redis前台交互式启动redis后台守护式启动Nginx容器运行ubuntu交互式运行tomcat交互式运行对外暴露访问端口 Dock…...

数据结构初阶:二叉树(一)

树概念及结构 树的概念 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 。 有一个特殊的结点&a…...

基于逻辑回归和支持向量机的前馈网络进行乳腺癌组织病理学图像分类

CNN&#xff08;卷积神经网络&#xff09;通过使用反向传播方法来学习特征&#xff0c;这种方法需要大量的训练数据&#xff0c;并且存在梯度消失问题&#xff0c;从而恶化了特征学习。 CNN卷积神经网络 CNN由一个多层神经网络组成&#xff0c;该网络从标记的训练数据集中学习…...

35-4 fastjson漏洞复现

环境准备:35-2 fastjson反序列化漏洞介绍 及漏洞环境搭建-CSDN博客 fastjson_tool.jar下载:fastjson_rce_tool: fastjson命令执行自动化利用工具, remote code execute,JNDI服务利用工具 RMI/LDAP (gitee.com) 一、攻击机kali开启nc监听6666端口(或其他端口也行,只要不…...

Qt-控件篇

QPushbutton 1、设置按钮文本 pushButton->setText("按钮"); 2、获取按钮文本 pushButton->text(); 3、设置按钮的大小为特定值&#xff08;宽度和高度&#xff09; pushButton->setFixedSize(width,height); 4、设置按钮悬停时的工具提示文本。 pushButto…...

实现 Table 的增加和删除,不依赖后端数据回显

需求 删除前 删除后 分析 首先写一个 Table <a-card style"width:100%"><template#extra><a-button type"text" click"addSelectItem" style"margin-right: 5px">添加</a-button><a-button type&quo…...

个人网站开发记录(七)——三系统后端nodejs+express

前言 这种已经完全工程化了的&#xff08;&#xff09;后端其实已经没啥好说的了&#xff0c;因为就是单纯的写接口然后调用接口就完事了&#xff01; 正文 唯一值得一提的大概是我在写这个系统的时候搞了https的链接&#xff0c;具体来说就是先申请一个ssl证书&#xff0c;…...

零基础养龙虾:OpenClaw部署从入门到上手,一篇讲透!

2026年&#xff0c;OpenClaw&#xff08;昵称 “龙虾”&#xff09;凭借 “能真正动手干活” 的核心能力&#xff0c;成为开源AI Agent领域的顶流。它不仅能像ChatGPT一样聊天&#xff0c;更能自主操作电脑——整理文件、控制浏览器、发送邮件、甚至调用硬件设备。因其图标酷似…...

如何用stressapptest进行高效内存和磁盘压力测试?实战案例分享

如何用stressapptest进行高效内存和磁盘压力测试&#xff1f;实战案例分享 在服务器运维和硬件性能评估中&#xff0c;内存和磁盘的稳定性直接关系到系统的可靠性。想象一下&#xff0c;当你的服务器在凌晨三点突然因为内存错误崩溃&#xff0c;或者磁盘在高峰期出现读写异常&a…...

OpenClaw 部署指南 (Linux)版本原始安装。

OpenClaw 部署指南 (Linux)版 这阵子工作忙得离谱,连折腾新东西的时间都没有。 “龙虾”的风吹过了,寻思着也不能一直当吃瓜群众,就跟一手,看看这玩意到底有多神。 老规矩,不整那些花里胡哨的,先本地跑起来再说。一步一步来,比一上来就搞什么生产环境靠谱多了。 这几…...

嵌入式通信协议SPI/I2C/UART原理与应用

嵌入式通信协议原理图解与技术解析1. 串行通信协议基础1.1 SPI通信协议SPI(Serial Peripheral Interface)是一种全双工、同步串行通信协议&#xff0c;采用主从架构设计。其核心特点包括&#xff1a;四线制结构&#xff1a;SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、SS(片选…...

Nemo文件管理器终极指南:Cinnamon桌面环境下的高效文件管理神器

Nemo文件管理器终极指南&#xff1a;Cinnamon桌面环境下的高效文件管理神器 【免费下载链接】nemo File browser for Cinnamon 项目地址: https://gitcode.com/gh_mirrors/ne/nemo Nemo是Cinnamon桌面环境的官方文件管理器&#xff0c;作为一个免费开源的软件项目&#…...

Qwen3.5-27BGPU算力优化实践:FP16量化+梯度检查点+内存映射技术

Qwen3.5-27B GPU算力优化实践&#xff1a;FP16量化梯度检查点内存映射技术 1. 引言 在部署大型视觉多模态模型Qwen3.5-27B时&#xff0c;GPU显存和计算效率是两大关键挑战。本文将分享我们在4张RTX 4090 D 24GB显卡环境下&#xff0c;通过FP16量化、梯度检查点和内存映射三项…...

企业级流程引擎如何重塑低代码开发?基于Vite+Vue3的可视化建模实践

企业级流程引擎如何重塑低代码开发&#xff1f;基于ViteVue3的可视化建模实践 【免费下载链接】vite-vue-bpmn-process 基于 Vite TypeScript Vue3 NaiveUI Bpmn.js 的流程编辑器&#xff08;前端部分&#xff09;。支持高度自定义&#x1f680;&#x1f680;&#x1f680;。…...

全桥LLC变换器死区时间优化实战:从IGBT硬开通到完美ZVS的调试记录

全桥LLC变换器死区时间优化实战&#xff1a;从IGBT硬开通到完美ZVS的调试记录 在电力电子领域&#xff0c;LLC谐振变换器因其高效率、高功率密度和良好的EMI特性&#xff0c;已成为中高功率应用的理想选择。然而&#xff0c;实际调试过程中&#xff0c;死区时间与励磁电感的匹配…...

Polars 2.0清洗架构解密(含完整数据流拓扑图):为什么92%的团队还在用Pandas硬扛TB级脏数据?

第一章&#xff1a;Polars 2.0清洗架构解密&#xff1a;从设计哲学到性能跃迁Polars 2.0 的清洗架构并非简单功能叠加&#xff0c;而是以“零拷贝流式处理”与“惰性执行图优化”为双核驱动的范式重构。其设计哲学根植于两个核心信条&#xff1a;数据不应在内存中被无谓复制&am…...

Llama-3.2V-11B-cot入门必看:Streamlit组件热重载加速UI迭代开发

Llama-3.2V-11B-cot入门必看&#xff1a;Streamlit组件热重载加速UI迭代开发 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B多模态大模型开发的高性能视觉推理工具&#xff0c;专为双卡4090环境深度优化。该工具通过Streamlit框架构建了直观易用的交互界面&#…...