C#基础:使用Linq进行简单去重处理(DinstinctBy/反射)
目录
一、示例代码
二、示例输出
三、注意雷点
四、全字段去重封装方法
1.封装
2.示例
一、示例代码
using System;
using System.Collections.Generic;
using System.Linq;public class Program
{public static void Main(){// 创建一些示例实体对象var people = new List<Person>{new Person { Name = "Alice", Age = 30, City = "New York" },new Person { Name = "Bob", Age = 25, City = "Los Angeles" },new Person { Name = "Alice", Age = 30, City = "New York" },//重复的new Person { Name = "Charlie", Age = 35, City = "Chicago" },new Person { Name = "Alice", Age = 28, City = "San Francisco" }};// 1. 单字段去重var uniqueNameFields = people.DistinctBy(p =>p.Name).ToList();Console.WriteLine("指定字段(Name)去重结果,重复则保留第一条:");foreach (var person in uniqueNameFields){Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, City: {person.City}");}// 2. 多字段去重var uniqueNameAgeFields = people.DistinctBy(p => new { p.Name, p.Age }).ToList();Console.WriteLine("\n指定字段(Name, Age)去重结果,重复则保留第一条:");foreach (var person in uniqueNameAgeFields){Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, City: {person.City}");}//3.全字段去重// 通过 GroupBy 按 Name 和 Age 字段去重var uniquePeople = people.DistinctBy(p => new { p.Name, p.Age, p.City }).ToList();Console.WriteLine("\n全字段去重:");foreach (var person in uniquePeople){Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, City: {person.City}");}}
}public class Person
{public string Name { get; set; }public int Age { get; set; }public string City { get; set; }
}
二、示例输出
指定字段(Name)去重结果,重复则保留第一条:
Name: Alice, Age: 30, City: New York
Name: Bob, Age: 25, City: Los Angeles
Name: Charlie, Age: 35, City: Chicago指定字段(Name, Age)去重结果,重复则保留第一条:
Name: Alice, Age: 30, City: New York
Name: Bob, Age: 25, City: Los Angeles
Name: Charlie, Age: 35, City: Chicago
Name: Alice, Age: 28, City: San Francisco全字段去重:
Name: Alice, Age: 30, City: New York
Name: Bob, Age: 25, City: Los Angeles
Name: Charlie, Age: 35, City: Chicago
Name: Alice, Age: 28, City: San Francisco
三、注意雷点
以下代码不能完成全字段去重,因为people是引用类型,Distinct() 一般用于List<string>,List<int>这些值类型去重,而不涉及引用类型的字段比较。
people.Distinct().ToList()
若需要全字段去重:1.使用DinstinctBy语法,加上所有字段。2.使用标题四的封装方法(反射实现全字段去重)。
四、全字段去重封装方法
1.封装
/// <summary>
/// 通用的全字段去重方法
/// </summary>
/// <returns></returns>
public static IEnumerable<T> DistinctByAllFields<T>(IEnumerable<T> items)
{// 获取 T 类型的所有字段值var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);return items.GroupBy(item => string.Join(",", properties.Select(p => p.GetValue(item)))) // 按所有字段值连接生成唯一标识符.Select(group => group.First()); // 取每组的第一个元素
}
2.示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;public class Program
{public static void Main(){// 创建一些示例实体对象var people = new List<Person>{new Person { Name = "Alice", Age = 30, City = "New York" },new Person { Name = "Bob", Age = 25, City = "Los Angeles" },new Person { Name = "Alice", Age = 30, City = "New York" },new Person { Name = "Charlie", Age = 35, City = "Chicago" },new Person { Name = "Alice", Age = 28, City = "San Francisco" }};// 调用封装的去重方法var uniquePeople = DistinctByAllFields(people).ToList();Console.WriteLine("根据所有字段去重的结果:");foreach (var person in uniquePeople){Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, City: {person.City}");}}/// <summary>/// 通用的全字段去重方法/// </summary>/// <returns></returns>public static IEnumerable<T> DistinctByAllFields<T>(IEnumerable<T> items){// 获取 T 类型的所有字段值var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);return items.GroupBy(item => string.Join(",", properties.Select(p => p.GetValue(item)))) // 按所有字段值连接生成唯一标识符.Select(group => group.First()); // 取每组的第一个元素}
}public class Person
{public string Name { get; set; }public int Age { get; set; }public string City { get; set; }
}
相关文章:
C#基础:使用Linq进行简单去重处理(DinstinctBy/反射)
目录 一、示例代码 二、示例输出 三、注意雷点 四、全字段去重封装方法 1.封装 2.示例 一、示例代码 using System; using System.Collections.Generic; using System.Linq;public class Program {public static void Main(){// 创建一些示例实体对象var people new Li…...
HTML5 面试题
1. HTML5 新增了哪些重要特性? 语义化标签:这些标签有助于提高页面的可读性和可维护性。多媒体支持:HTML5 引入了 和 标签,可以直接嵌入音频和视频文件,无需依赖插件。本地存储:引入了 localStorage 和 se…...
【C++】优先级队列宝藏岛
> 🍃 本系列为初阶C的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:[小编的个人主页])小编的个人主页 > 🎀 🎉欢迎大家点赞👍收藏⭐文章 > ✌️ 🤞 …...
开关电源实战(一)宽范围DC降压模块MP4560
系列文章目录 文章目录 系列文章目录MP4560MP4560 3.8V 至 55V 的宽输入范围可满足各种降压应用 MOSFET只有250mΩ 输出可调0.8V-52V SW:需要低VF肖特基二极管接地,而且要靠近引脚,高压侧开关的输出。 EN:输入使能,拉低到阈值以下关闭芯片,拉高或浮空启动 COMP:Compens…...
Git是什么
简单介绍: Git是一个分布式版本控制系统,用于跟踪文件的更改,特别是在多人协作开发的环境中。 Key: 分布式 版本控制 系统 最常用于软件开发,但也可以用于管理任何类型的文件和文件夹。 Git帮助团队跟踪和管理文件的历史版本&a…...
双非计科毕业,二战未果想就业,选择嵌入式开发还是Java开发更合适?
今天给大家分享的是一位粉丝的提问,双非计科毕业,二战未果想就业,选择嵌入式开发还是Java开发更合适? 接下来把粉丝的具体提问和我的回复分享给大家,希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问&#x…...
性格测评小程序开发指南
目录 前言目录01 需求分析02 数据源设计03 搭建用户管理04 题库管理05 用户注册06 用户注册校验07 用户登录08 测评功能搭建09 提交结果10 生成报告 学习目标面向人群结语 前言 欢迎阅读《性格测评小程序开发指南》!本书旨在为开发者、低代码爱好者和学习者提供一个…...
shell编程总结
前言 shell编程学习总结,1万3千多字带你学习shell编程 往期推荐 14wpoc,nuclei全家桶:nuclei模版管理工具Nuclei 哥斯拉二开,免杀绕过规避流量检测设备 fscan全家桶:FscanPlus,fs,fscan适用…...
析言GBI:用自然语言交互重构企业数据分析范式
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...
【论文技巧】Mermaid VSCode插件制作流程图保存方法
插流程图快点 利用Mermaid Preview插件自带功能 如果你的VSCode安装了支持导出图片的Mermaid预览插件(如 Mermaid Markdown Syntax Highlighting 等),可以按以下步骤进行: 打开Mermaid代码文件:在VSCode中打开包含M…...
Unity 位图字体
下载Bitmap Font Generator BMFont - AngelCode.com 解压后不用安装直接双击使用 提前设置 1、设置Bit depth为32 Options->Export options 2、清空所选字符 因为我们将在后边导入需要的字符。 Edit->Select all chars 先选择所有字符 Edit->Clear all chars i…...
科技快讯 | DeepSeek推出NSA加速长上下文训练,xAI Grok系列将陆续开源,月之暗面发布Kimi Latest新模型
阶跃星辰首次开源Step系列多模态大模型 2月18日,财联社消息,阶跃星辰与吉利汽车集团宣布,双方合作开发的阶跃Step系列多模态大模型向全球开发者开源。包括参数量达300亿的Step-Video-T2V视频生成模型和行业内首款产品级开源语音交互大模型Ste…...
网络安全 | 5G网络安全:未来无线通信的风险与对策
网络安全 | 5G网络安全:未来无线通信的风险与对策 一、前言二、5G 网络的技术特点2.1 超高速率与低延迟2.2 大容量连接与网络切片三、5G 网络面临的安全风险3.1 网络架构安全风险3.2 设备终端安全风险3.3 应用场景安全风险3.4 用户隐私安全风险四、5G 网络安全对策4.1 强化网络…...
Linux 实操篇 组管理和权限管理、定时任务调度、Linux磁盘分区和挂载
一、组管理和权限管理 (1)Linux组基本介绍 在linux中的每个用户必须属于一个组,不能独立于组外 在linux中每个文件有所有者、所在组、其他组的概念 (2)文件/目录 所有者 一般为文件的创建者,谁创建了该…...
应用案例 | uaGate SI助力汽车零部件工厂将生产数据传输到MES
一、背景和挑战 (图1 汽车零部件工厂生产车间) 随着汽车工业的不断发展,新能源汽车市场的竞争日益激烈,这对汽车零部件供应商提出了更高的要求,包括提升产品精度、增强可靠性、节能环保以及控制成本等多个方面。某国际…...
Android JNI的理解与使用。
写在前面:Java相对于C/C来说是更高级的语言,隐藏了指针,可读性更高,更容易学习,但是无法直接操作硬件、运行速度较慢也是不可回避的硬伤。JNI就是Java官方定义的一套标准“接口”,用于Java和C/C之间互相调用…...
fpga助教面试题
第一题 module sfp_pwm( input wire clk, //clk is 200M input wire rst_n, input wire clk_10M_i, input wire PPS_i, output reg pwm ) reg [6:0] cunt ;always (posedge clk ) beginif(!rst_n)cunt<0;else if(cunt19) //200M是10M的20倍cunt<0;elsecunt<cunt1;…...
Git命令详解与工作流介绍:全面掌握版本控制系统的操作指南
Git Git是一个版本控制系统(也称为源代码控制系统),允许程序员和其他处理文本文件的人在独立工作时协调更改。Git还支持二进制资产,如图片,但这些格式不支持逐行版本管理,这使得版本控制真正强大。 Git概…...
提升信息检索准确性和效率的搜索技巧
一、基础技巧 精准关键词 避免长句子,提取核心关键词(如用“光合作用 步骤”代替“请告诉我光合作用的具体过程”)。 同义词替换:尝试不同表达(如“AI 发展史” vs “人工智能 历史”)。 排除干扰词 使用…...
Qt 中使用 ffmpeg 获取采集卡数据录制视频
作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 之前做了一个功能,从采集卡获取数据然后录制成视频,结果发现录制的视频内存占用非常大,1分钟的…...
Agent Zero:构建可生长、透明化的个人AI智能体伙伴
1. 项目概述:一个能与你共同成长的个人AI伙伴 如果你厌倦了那些功能固定、像个“黑盒子”一样难以理解和定制的AI助手,那么Agent Zero的出现,可能会让你眼前一亮。这不仅仅是一个工具,更像是一个数字化的“学徒”或“伙伴”。它的…...
打破语言壁垒:XUnity.AutoTranslator让全球游戏无障碍畅玩
打破语言壁垒:XUnity.AutoTranslator让全球游戏无障碍畅玩 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾因语言障碍而错过精彩的游戏剧情?XUnity.AutoTranslator作为一款…...
基于Agent-Dev框架的智能体开发:从模块化设计到生产部署实践
1. 项目概述:从“Agent-Dev”看智能体开发的新范式最近在GitHub上看到一个挺有意思的项目,叫little51/agent-dev。光看名字,你可能会觉得这又是一个关于AI智能体开发的常规工具库。但当我深入进去,把它的代码、文档和社区讨论都翻…...
Qwen3-VL-8B AI聊天系统实战:从零到一搭建图文对话Web应用
Qwen3-VL-8B AI聊天系统实战:从零到一搭建图文对话Web应用 1. 项目概述与核心价值 在当今AI技术快速发展的背景下,多模态交互系统正成为企业服务和个人应用的新标准。Qwen3-VL-8B作为一款轻量级视觉语言模型,通过8B参数的精心设计ÿ…...
AI智能体框架yu-ai-agent:快速构建与部署开发者指南
1. 项目概述:一个面向开发者的AI智能体框架最近在GitHub上闲逛,发现了一个挺有意思的项目,叫yu-ai-agent。这个项目来自开发者liyupi,也就是大家熟知的“程序员鱼皮”。看到这个名字,我的第一反应是:这应该…...
Stable Yogi Leather-Dress-Collection高清作品:8K放大后仍清晰的皮革纹理表现
Stable Yogi Leather-Dress-Collection高清作品:8K放大后仍清晰的皮革纹理表现 1. 惊艳的皮革纹理表现 Stable Yogi Leather-Dress-Collection展示了令人惊叹的皮革纹理生成能力。即使在8K分辨率下放大查看,皮革的纹理细节依然清晰可见,包括…...
Python与OpenUSD:3D内容创作的自动化利器
1. 为什么Python与OpenUSD是天作之合 OpenUSD(Universal Scene Description)正在彻底改变3D内容创作的工作流程。作为一个开源、可扩展的生态系统,它能够高效地描述、组合和模拟复杂的3D场景。而Python作为OpenUSD的"黄金搭档"&am…...
pyautogui 第一章:鼠标全功能操作(核心1)
PyAutoGUI 鼠标全功能操作教程(核心1) 说明:本教程为 PyAutoGUI 核心操作专项教程,聚焦鼠标全功能操作,包含详细参数说明、实操代码、注意事项,适配新手入门,可直接复制代码调试运行。所有操作均…...
Terraform实战进阶:从模块化到CI/CD的完整技能树构建
1. 项目概述:一个Terraform技能提升的实战宝库如果你正在使用Terraform管理云上基础设施,或者正准备踏入IaC(基础设施即代码)的世界,那么你很可能听说过Anton Babenko这个名字。作为Terraform社区的活跃贡献者和知名专…...
Dialop:基于状态机的前端对话式应用开发框架实战指南
1. 项目概述:一个被低估的对话式应用开发框架最近在折腾一个需要集成复杂对话逻辑的Web应用,从简单的客服机器人到多轮交互的数据收集工具,市面上能找到的框架要么太重,要么太轻,要么就是文档写得云里雾里。就在我准备…...
