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

C#对象集合去重的一种方式

前言

现在AI越来越强大了,有很多问题其实不需要在去各个网站上查了,直接问AI就好了,但是呢,AI给的代码可能能用,也可能需要调整,但是自己肯定是要会的,所以还是总结一下吧。

问题

如果有一个对象集合,想要进行去重,直接通过Distinct是不可以的,因为对象是属于引用类型,对引用类型进行比较的时候,比较的是对象的引用地址,而集合中的不同对象的地址是不一样的,所以无法通过Distinct进行去重。比如下面这段代码。

namespace 对象集合去重
{internal class Program{static void Main(string[] args){var books = new List<Book>();books.Add(new Book() { Id = 1, Name = "C#" });books.Add(new Book() { Id = 1, Name = "C#" });books.Add(new Book() { Id = 2, Name = "JAVA" });books.Add(new Book() { Id = 2, Name = "JAVA" });books.Add(new Book() { Id = 3, Name = "Python" });var distinctBooks = books.Distinct();foreach (var book in distinctBooks){Console.WriteLine(book.ToString());}}}class Book{public int Id;public string? Name;public override string ToString(){return $"Id={Id},Name={Name}";}}
}

输出结果如下
在这里插入图片描述

解决方式

那么如何解决这个问题呢?解决的方法有很多,可以用遍历重新比较值或者其他方法解决,那么今天我就来介绍一个简单的方法。Distinct默认是使用Equals方法比较是否相等,在对象集合里,默认比较的是引用,那么我们也只是需要重写Equals方法,让它进行值的比较就可以了。
可以直接重写Equals方法,也可以继承IEquatable接口实现Equals方法,完整代码如下。

注意别忘了也需要重写GetHashCode方法哟。

namespace 对象集合去重
{internal class Program{static void Main(string[] args){var books = new List<Book>();books.Add(new Book() { Id = 1, Name = "C#" });books.Add(new Book() { Id = 1, Name = "C#" });books.Add(new Book() { Id = 2, Name = "JAVA" });books.Add(new Book() { Id = 2, Name = "JAVA" });books.Add(new Book() { Id = 3, Name = "Python" });var distinctBooks = books.Distinct();foreach (var book in distinctBooks){Console.WriteLine(book.ToString());}}}class Book: IEquatable<Book>{public int Id;public string? Name;public bool Equals(Book? other){return other!=null && Id == other.Id && Name==other.Name;}public override int GetHashCode(){return HashCode.Combine(Id, Name);}public override string ToString(){return $"Id={Id},Name={Name}";}}
}

输出结果如下。
在这里插入图片描述
OK 解决。

Study hard and make progress every day.

http://www.lryc.cn/news/2391820.html

相关文章:

  • 【LangChain】
  • Java 面试实录:从Spring到微服务的技术探讨
  • 在ROS2(humble)+Gazebo+rqt下,实时显示仿真无人机的相机图像
  • github双重认证怎么做
  • 数据的类型——认识你的数据
  • DeepSeek与AI提示语设计的全面指南
  • Kafka KRaft + SSL + SASL/PLAIN 部署文档
  • Codeforces Round 1027 (Div. 3)
  • 动态内容加载时,爬虫应如何处理?
  • 第五十二节:增强现实基础-简单 AR 应用实现
  • 前端高频面试题1:HTML/CSS/浏览器/计算机网络
  • LLaMaFactory 微调QwenCoder模型
  • Git全流程操作指南
  • 【最新版】Arduino IDE的安装入门Demo
  • 不起火,不爆炸,高速摄像机、数字图像相关DIC技术在动力电池新国标安全性能测试中的应用
  • thinkadmin中使用layui日期选择器,数据库存储时间戳
  • WSL中ubuntu通过Windows带代理访问github
  • RISC-V特权模式及切换
  • Python爬虫实战:研究Tornado框架相关技术
  • 【深度学习】11. Transformer解析: Self-Attention、ELMo、Bert、GPT
  • Ubuntu实现和主机的复制粘贴 VMware-Tools(open-vm-tools)
  • 4060显卡什么水平 4060显卡参数介绍
  • Kafka Producer 如何实现Exactly Once消息传递语义
  • 通过ansible playbook创建azure 资源
  • C++双线程交替打印奇偶数(活泼版)
  • 技术为器,服务为本:AI时代的客服价值重构
  • hadoop异构存储
  • EasyVoice:开源的文本转语音工具,让文字“开口说话“
  • 扫地机产品异物进入吸尘口堵塞异常检测方案
  • C++并集查找