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

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 新增了哪些重要特性&#xff1f; 语义化标签&#xff1a;这些标签有助于提高页面的可读性和可维护性。多媒体支持&#xff1a;HTML5 引入了 和 标签&#xff0c;可以直接嵌入音频和视频文件&#xff0c;无需依赖插件。本地存储&#xff1a;引入了 localStorage 和 se…...

【C++】优先级队列宝藏岛

> &#x1f343; 本系列为初阶C的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:[小编的个人主页])小编的个人主页 > &#x1f380; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 > ✌️ &#x1f91e; &#x1…...

开关电源实战(一)宽范围DC降压模块MP4560

系列文章目录 文章目录 系列文章目录MP4560MP4560 3.8V 至 55V 的宽输入范围可满足各种降压应用 MOSFET只有250mΩ 输出可调0.8V-52V SW:需要低VF肖特基二极管接地,而且要靠近引脚,高压侧开关的输出。 EN:输入使能,拉低到阈值以下关闭芯片,拉高或浮空启动 COMP:Compens…...

Git是什么

简单介绍&#xff1a; Git是一个分布式版本控制系统&#xff0c;用于跟踪文件的更改&#xff0c;特别是在多人协作开发的环境中。 Key: 分布式 版本控制 系统 最常用于软件开发&#xff0c;但也可以用于管理任何类型的文件和文件夹。 Git帮助团队跟踪和管理文件的历史版本&a…...

双非计科毕业,二战未果想就业,选择嵌入式开发还是Java开发更合适?

今天给大家分享的是一位粉丝的提问&#xff0c;双非计科毕业&#xff0c;二战未果想就业&#xff0c;选择嵌入式开发还是Java开发更合适&#xff1f; 接下来把粉丝的具体提问和我的回复分享给大家&#xff0c;希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问&#x…...

性格测评小程序开发指南

目录 前言目录01 需求分析02 数据源设计03 搭建用户管理04 题库管理05 用户注册06 用户注册校验07 用户登录08 测评功能搭建09 提交结果10 生成报告 学习目标面向人群结语 前言 欢迎阅读《性格测评小程序开发指南》&#xff01;本书旨在为开发者、低代码爱好者和学习者提供一个…...

shell编程总结

前言 shell编程学习总结&#xff0c;1万3千多字带你学习shell编程 往期推荐 14wpoc&#xff0c;nuclei全家桶&#xff1a;nuclei模版管理工具Nuclei 哥斯拉二开&#xff0c;免杀绕过规避流量检测设备 fscan全家桶&#xff1a;FscanPlus&#xff0c;fs&#xff0c;fscan适用…...

析言GBI:用自然语言交互重构企业数据分析范式

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、Java 与 Python 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在未来…...

【论文技巧】Mermaid VSCode插件制作流程图保存方法

插流程图快点 利用Mermaid Preview插件自带功能 如果你的VSCode安装了支持导出图片的Mermaid预览插件&#xff08;如 Mermaid Markdown Syntax Highlighting 等&#xff09;&#xff0c;可以按以下步骤进行&#xff1a; 打开Mermaid代码文件&#xff1a;在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日&#xff0c;财联社消息&#xff0c;阶跃星辰与吉利汽车集团宣布&#xff0c;双方合作开发的阶跃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磁盘分区和挂载

一、组管理和权限管理 &#xff08;1&#xff09;Linux组基本介绍 在linux中的每个用户必须属于一个组&#xff0c;不能独立于组外 在linux中每个文件有所有者、所在组、其他组的概念 &#xff08;2&#xff09;文件/目录 所有者 一般为文件的创建者&#xff0c;谁创建了该…...

应用案例 | uaGate SI助力汽车零部件工厂将生产数据传输到MES

一、背景和挑战 &#xff08;图1 汽车零部件工厂生产车间&#xff09; 随着汽车工业的不断发展&#xff0c;新能源汽车市场的竞争日益激烈&#xff0c;这对汽车零部件供应商提出了更高的要求&#xff0c;包括提升产品精度、增强可靠性、节能环保以及控制成本等多个方面。某国际…...

Android JNI的理解与使用。

写在前面&#xff1a;Java相对于C/C来说是更高级的语言&#xff0c;隐藏了指针&#xff0c;可读性更高&#xff0c;更容易学习&#xff0c;但是无法直接操作硬件、运行速度较慢也是不可回避的硬伤。JNI就是Java官方定义的一套标准“接口”&#xff0c;用于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是一个版本控制系统&#xff08;也称为源代码控制系统&#xff09;&#xff0c;允许程序员和其他处理文本文件的人在独立工作时协调更改。Git还支持二进制资产&#xff0c;如图片&#xff0c;但这些格式不支持逐行版本管理&#xff0c;这使得版本控制真正强大。 Git概…...

提升信息检索准确性和效率的搜索技巧

一、基础技巧 精准关键词 避免长句子&#xff0c;提取核心关键词&#xff08;如用“光合作用 步骤”代替“请告诉我光合作用的具体过程”&#xff09;。 同义词替换&#xff1a;尝试不同表达&#xff08;如“AI 发展史” vs “人工智能 历史”&#xff09;。 排除干扰词 使用…...

Qt 中使用 ffmpeg 获取采集卡数据录制视频

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 之前做了一个功能&#xff0c;从采集卡获取数据然后录制成视频&#xff0c;结果发现录制的视频内存占用非常大&#xff0c;1分钟的…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布&#xff0c;Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明&#xff0c;Elastic 作为 …...