解决方案
5
1.本人实现一个 compare方法 或接口. 用迭代比较去重
2.重写GetHashCode 函数.用HashSet去重
2.重写GetHashCode 函数.用HashSet去重
5
compare主要是排序用的。应该是IEqualityComparer
20
HashSet<T>去重的逻辑是这样的:
比较两个对象的Hash, 假如hash不同,则两个对象一定不同,就直接加入HashSet。
否则,使用EqualityComparer<T>.Default进行比较,假如相同就不加入,否则加入。
你看到HashSet的构造函数接受一个IEqualityComparer<T>的参数,假如你传入了本人的实例,那么HashSet就用你的实例进行比较。假如你不传,那么默认就用EqualityComparer<T>.Default进行比较。
EqualityComparer<T>.Default返回的结果是根据T来决定的。
假如T实现了IEquatable<T>接口。也就是说,你本人的类要实现这个接口。那么它就调用你的IEquatable接口来进行对象比较。
假如你没有实现这个接口,那么默认就返回ObjectEqualityComparer<T>, 这是一个内部类。
ObjectEqualityComparer<T>的主要逻辑是调用你的对象的Equals方法来进行比较。
假如你重写了Equals方法,那么它将被调用。否则就调用Object的Equals方法的默认实现来比较。
默认情况下,两个对象不是指向一个引用,所以当然不相等。也就无法去重了。
所以解决方案如下:
创建本人的IEqualityComparer。
或,让类实现IEquatable接口。
或,让类重写Equals方法。
10
类继承 IEqualityComparer 接口,并实现Equals方法