时间:2021-05-20
我们在想对一个可枚举的对象集合进行去重操作时,一般第一个想到的就是就是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对象了,成功实现了去重。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
平时,我们将c#中的Distinct大多用于对数组去重,一般数组为基础的数据类型,例如int,string.也可以用于对象去重,我们看看C#对Distinct方
最近正在学习c#,对其中的方法重写和隐藏的概念很是模糊,现在将其归纳如下:1:方法重写:就是在基类中的方法用virtual关键字来标识,然后在继承类中对该类进行
本文实例为大家分享了C#重写DataGridView的实例代码,供大家参考,具体内容如下usingSystem;usingSystem.Collections.
C#实现文件拖放并打开文件需要知道的ListBox的两个事件:当您在控件的边界内拖动对象时,便会发生DragEnter事件;该事件用于确定当前拖动的对象是不是您
本文实例讲述了C#通过重写Panel改变边框颜色与宽度的方法。分享给大家供大家参考。具体实现方法如下:usingSystem;usingSystem.Colle