C# Distinct和重写IEqualityComparer时要知道的二三事
我们在想对一个可枚举的对象集合进行去重操作时,一般第一个想到的就是就是Linq的Distinct方法。
先定义一个类,然后使用Distinct方法去重
classMan { publicintAge{get;set;} publicstringName{get;set;} publicstringAdress{get;set;} publicdecimalWeight{get;set;} publicdecimalHeight{get;set;} }
Listlist=newList () { newMan(){Age=21,Name="Adam",Adress="Shenzhen",Weight=60,Height=170}, newMan(){Age=21,Name="Adam",Adress="Shenzhen",Weight=60,Height=170} }; vardistinct=list.Distinct();
然而去重得到的distinct集合的Count依然为二,集合里依然存在两个Adam。
实际上,Distinct方法内进行比较的是声明的引用,而不是对象属性,就和对两个属性一模一样的对象使用Equals()方法得到的是False一样。
因此我们对对象集合使用Distinct方法时要使用重载Distinct
要使用这个方法,我们得重写IEqualityComparer接口,再使用Distinct方法:
publicclassManComparer:IEqualityComparer{ publicboolEquals(Manx,Many) { returnx.Age==y.Age &&x.Name==y.Name &&x.Adress==y.Adress &&x.Weight==y.Weight &&x.Height==y.Height; } publicintGetHashCode(Manobj) { returnobj.GetHashCode(); } } vardistinct=list.Distinct(newManComparer());
然而,再一次,distinct集合内依然有两个对象。
实际上,由于直接获取对象的HashCode,用HashCode进行比较的速度比Equals方法更快,
因此IEqualityComparer内部会在使用Equals前先使用GetHashCode方法,在两个对象的HashCode都相同时即刻判断对象相等。
而当两个对象HashCode不相同时,Equals方法就会被调用,对要比较的对象进行判断。
由于在上例中list中的两个引用实际上是两个不同的对象,因此HashCode必定不相同
所以要触发Equlas方法,我们需要改GetHashCode,让它返回相同的常量
publicclassManComparerNew:IEqualityComparer{ publicboolEquals(Manx,Many) { returnx.Age==y.Age &&x.Name==y.Name &&x.Adress==y.Adress &&x.Weight==y.Weight &&x.Height==y.Height; } publicintGetHashCode(Manobj) { return1; } } vardistinct=list.Distinct(newManComparerNew());
现在distinct集合中就只有一个Man对象了,成功实现了去重。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。