C#Distinct和重写IEqualityComparer时要知道的二三事

更新时间:2023-07-11 19:05:36 阅读: 评论:0

C#Distinct和重写IEqualityComparer时要知道的⼆三事我们在想对⼀个可枚举的对象集合进⾏去重操作时,⼀般第⼀个想到的就是就是Linq的Distinct⽅法。边境牧羊犬
先定义⼀个类,然后使⽤Distinct⽅法去重
class Man
{
public int Age { get; t; }
public string Name { get; t; }
public string Adress { get; t; }
public decimal Weight { get; t; }
public decimal Height { get; t; }
}
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()⽅法得到的是Fal⼀样。
因此我们对对象集合使⽤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对象了,成功实现了去重。
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。

本文发布于:2023-07-11 19:05:36,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1091211.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   集合   希望   学习
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图