list去重

.Net技术 码拜 8年前 (2016-05-11) 1116次浏览
list去重两个数据一摸一样 但是用HashSet无法去重。九行数据传进去还是就行数据传出来。
解决方案

5

1.本人实现一个 compare方法 或接口.  用迭代比较去重
2.重写GetHashCode 函数.用HashSet去重

5

引用:

1.本人实现一个 compare方法 或接口.  用迭代比较去重
2.重写GetHashCode 函数.用HashSet去重

compare主要是排序用的。应该是IEqualityComparer

20

引用:
Quote: 引用:
Quote: 引用:

1.本人实现一个 compare方法 或接口.  用迭代比较去重
2.重写GetHashCode 函数.用HashSet去重

compare主要是排序用的。应该是IEqualityComparer

本人去看一看。

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方法

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明list去重
喜欢 (0)
[1034331897@qq.com]
分享 (0)