[C#]关于Distinct与重写IEqualityComparer时得知道的二三事
我们在想对一个可枚举的对象集合进行去重操作时,一般第一个想到的就是就是Linq的Distinct方法。
先定义一个类,然后使用Distinct方法去重
class Man{public int Age { get; set; }public string Name { get; set; }public string Adress { get; set; }public decimal Weight { get; set; }public decimal Height { get; set; }}
List<Man> list = new List<Man>(){ new Man(){Age=21,Name="Adam",Adress="Shenzhen",Weight=60,Height=170},new Man(){Age=21,Name="Adam",Adress="Shenzhen",Weight=60,Height=170}};var distinct = list.Distinct();
然而去重得到的distinct集合的Count依然为二,集合里依然存在两个Adam。
实际上,Distinct方法内进行比较的是声明的引用,而不是对象属性,就和对两个属性一模一样的对象使用Equals()方法得到的是False一样。
因此我们对对象集合使用Distinct方法时要使用重载Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer);
要使用这个方法,我们得重写IEqualityComparer接口,再使用Distinct方法:
public class ManComparer : IEqualityComparer<Man>{public bool Equals(Man x, Man y){return x.Age == y.Age&& x.Name == y.Name&& x.Adress == y.Adress&& x.Weight == y.Weight&& x.Height == y.Height;}public int GetHashCode(Man obj){return obj.GetHashCode();}}var distinct = list.Distinct(new ManComparer());
然而,再一次,distinct集合内依然有两个对象。
实际上,由于直接获取对象的HashCode,用HashCode进行比较的速度比 Equals 方法更快,
因此IEqualityComparer内部会在使用 Equals 前先使用 GetHashCode 方法,在两个对象的HashCode都相同时即刻判断对象相等。
而当两个对象HashCode不相同时, Equals 方法就会被调用,对要比较的对象进行判断。
由于在上例中list中的两个引用实际上是两个不同的对象,因此HashCode必定不相同
所以要触发Equlas方法,我们需要改 GetHashCode ,让它返回相同的常量
public class ManComparerNew : IEqualityComparer<Man>{public bool Equals(Man x, Man y){return x.Age == y.Age&& x.Name == y.Name&& x.Adress == y.Adress&& x.Weight == y.Weight&& x.Height == y.Height;}public int GetHashCode(Man obj){return 1;}}var distinct = list.Distinct(new ManComparerNew());
现在distinct集合中就只有一个Man对象了,成功实现了去重。
`
转载于:https://www.cnblogs.com/mirageJ/p/8950842.html
[C#]关于Distinct与重写IEqualityComparer时得知道的二三事相关推荐
- 面试官:重写 equals 时为什么一定要重写 hashCode?
作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 重要说明:本篇为博主<面试题精选-基础篇>系列中的一篇,关注 ...
- 重写equals()时为什么也得重写hashCode()之深度解读equals方法与hashCode方法渊源
重写equals()时为什么也得重写hashCode()之深度解读equals方法与hashCode方法渊源 在使用Map接口时,我们的愿望是当key1.equals(key2)时,它们获取的valu ...
- 负载均衡SLB中开启会话保持并选择重写Cookie时的配置方法
负载均衡SLB中开启会话保持并选择重写Cookie时的配置方法 KB: 27704 · 更新时间:2020-09-08 15:12:41 编辑 · 本页目录 概述 详细信息 更多信息 适用于 免责声明 ...
- 知云文献翻译登录时不显示二维码,显示二维码后扫描登录不跳转解决方案
1.登录时不显示二维码--解决方案 打开 Internet Explorer 点击"设置"中的"Internet 选项" 切换到"连接"选项 ...
- java equals重写原则_java中为何重写equals时必须重写hashCode方法详解
前言 大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 在上一篇博文Ja ...
- [C#]关于override和new在重写方法时的区别
规则: 在"运行时"遇到虚方法时,对象会调用虚成员派生得最远的.重写的实现. 如果是用new修饰符实现的方法,它会在基类面前隐藏派生类重新声明的成员,这时候会找到使用new修饰符的 ...
- why在重写equals时还必须重写hashcode方法
首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法 public boolean equals(Object anO ...
- 为什么重写equals时必须重写hashCode方法?
2019独角兽企业重金招聘Python工程师标准>>> 首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashco ...
- android studio提示要重写的方法,Android Studio 重写方法时参数命名异常
kuangbin_SegTree M (HDU 4553) put my gezi这句话不得不说我看了好几秒才反应过来什么意思(你咋不上天呢 目测了一下也是区间合并 但是是成段更新的区间合并 但是!我 ...
最新文章
- java的虚引用_你不可不知的Java引用类型之——虚引用
- MATLAB实例路径与安装路径
- opencv极坐标转换成直角坐标_媲美 PS,用 Python 制作酷炫极坐标全景图
- .NET 将文本转换成语音 (转)
- 为什么python打包的应用那么大_浅谈python3打包与拆包在函数的应用详解
- python 魔法函数 __add___PythonI/O进阶学习笔记_2.魔法函数
- mysql某月按小时统计数据_Mysql按周,按月,按日,按小时分组统计数据
- 深度学习都是非凸问题_神经网络的损失函数为什么是非凸的?
- 35岁老程序员因身体原因没加班,老板:不想干就滚蛋
- 应用层为何不能设置分辨率
- Spring Mvc 整合 Mybatis
- 【ACM】杭电1070:Milk
- 对象释放函数kmem_cache_free核心函数slab_free的实现详解
- 关于重装系统后,电脑出现提示许可证过期的解决方案
- cxp文件查看 欧姆龙_欧姆龙PLC CXP编程软件外文手册
- 桌面创建html文件夹路径,HTML5+ - DirectoryEntry(文件夹及文件操作)
- 微信小程序自定义弹窗2.0
- Excel表格中如何换行
- 【JAVA】金额工具类 金额千分位、中文大写金额、英文金额
- 最适合编程的笔记本电脑是什么?
热门文章
- Linux下mysql备份
- 宿主机访问虚拟机中xampp搭建的站点失败
- 为什么中国程序员水平一直上不了层次?无非是这些原因!
- JDBC与mysql同为CST时区导致数据库时间和客户端时间差13或者14小时
- 可以把兴趣变成工作吗?
- 线程池是怎样工作的?
- 有赞多级缓存解决方案怎么做的,你知道吗?
- 从HashiCorp Nomad对上百万容器进行调度所学到的经验
- 【Scratch】青少年蓝桥杯_每日一题_4.19_考试成绩
- “adb”不是内部或外部命令,也不是可运行的程序或批处理文件(Win)与(Mac)——终极解决方案