[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时得知道的二三事的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode第19题;删除链表的倒数
- 下一篇: Echarts的简单使用