我们在想对一个可枚举的对象集合进行去重操作时,一般第一个想到的就是就是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时得知道的二三事相关推荐

  1. 面试官:重写 equals 时为什么一定要重写 hashCode?

    作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 重要说明:本篇为博主<面试题精选-基础篇>系列中的一篇,关注 ...

  2. 重写equals()时为什么也得重写hashCode()之深度解读equals方法与hashCode方法渊源

    重写equals()时为什么也得重写hashCode()之深度解读equals方法与hashCode方法渊源 在使用Map接口时,我们的愿望是当key1.equals(key2)时,它们获取的valu ...

  3. 负载均衡SLB中开启会话保持并选择重写Cookie时的配置方法

    负载均衡SLB中开启会话保持并选择重写Cookie时的配置方法 KB: 27704 · 更新时间:2020-09-08 15:12:41 编辑 · 本页目录 概述 详细信息 更多信息 适用于 免责声明 ...

  4. 知云文献翻译登录时不显示二维码,显示二维码后扫描登录不跳转解决方案

    1.登录时不显示二维码--解决方案 打开 Internet Explorer 点击"设置"中的"Internet 选项" 切换到"连接"选项 ...

  5. java equals重写原则_java中为何重写equals时必须重写hashCode方法详解

    前言 大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 在上一篇博文Ja ...

  6. [C#]关于override和new在重写方法时的区别

    规则: 在"运行时"遇到虚方法时,对象会调用虚成员派生得最远的.重写的实现. 如果是用new修饰符实现的方法,它会在基类面前隐藏派生类重新声明的成员,这时候会找到使用new修饰符的 ...

  7. why在重写equals时还必须重写hashcode方法

    首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashcode方法 public boolean equals(Object anO ...

  8. 为什么重写equals时必须重写hashCode方法?

    2019独角兽企业重金招聘Python工程师标准>>> 首先我们先来看下String类的源码:可以发现String是重写了Object类的equals方法的,并且也重写了hashco ...

  9. android studio提示要重写的方法,Android Studio 重写方法时参数命名异常

    kuangbin_SegTree M (HDU 4553) put my gezi这句话不得不说我看了好几秒才反应过来什么意思(你咋不上天呢 目测了一下也是区间合并 但是是成段更新的区间合并 但是!我 ...

最新文章

  1. java的虚引用_你不可不知的Java引用类型之——虚引用
  2. MATLAB实例路径与安装路径
  3. opencv极坐标转换成直角坐标_媲美 PS,用 Python 制作酷炫极坐标全景图
  4. .NET 将文本转换成语音 (转)
  5. 为什么python打包的应用那么大_浅谈python3打包与拆包在函数的应用详解
  6. python 魔法函数 __add___PythonI/O进阶学习笔记_2.魔法函数
  7. mysql某月按小时统计数据_Mysql按周,按月,按日,按小时分组统计数据
  8. 深度学习都是非凸问题_神经网络的损失函数为什么是非凸的?
  9. 35岁老程序员因身体原因没加班,老板:不想干就滚蛋
  10. 应用层为何不能设置分辨率
  11. Spring Mvc 整合 Mybatis
  12. 【ACM】杭电1070:Milk
  13. 对象释放函数kmem_cache_free核心函数slab_free的实现详解
  14. 关于重装系统后,电脑出现提示许可证过期的解决方案
  15. cxp文件查看 欧姆龙_欧姆龙PLC CXP编程软件外文手册
  16. 桌面创建html文件夹路径,HTML5+ - DirectoryEntry(文件夹及文件操作)
  17. 微信小程序自定义弹窗2.0
  18. Excel表格中如何换行
  19. 【JAVA】金额工具类 金额千分位、中文大写金额、英文金额
  20. 最适合编程的笔记本电脑是什么?

热门文章

  1. Linux下mysql备份
  2. 宿主机访问虚拟机中xampp搭建的站点失败
  3. 为什么中国程序员水平一直上不了层次?无非是这些原因!
  4. JDBC与mysql同为CST时区导致数据库时间和客户端时间差13或者14小时
  5. 可以把兴趣变成工作吗?
  6. 线程池是怎样工作的?
  7. 有赞多级缓存解决方案怎么做的,你知道吗?
  8. 从HashiCorp Nomad对上百万容器进行调度所学到的经验
  9. 【Scratch】青少年蓝桥杯_每日一题_4.19_考试成绩
  10. “adb”不是内部或外部命令,也不是可运行的程序或批处理文件(Win)与(Mac)——终极解决方案