为什么C#hashSet接受添加两个具有相同getHashCode()值的对象?

时间:2012-06-06 15:06:29

标签: c# hashset

我有一个覆盖GetHashCode()的CustomObject对象。 我有一个HashSet,我可以使用具有相同哈希码的两个不同对象调用add。 两者都被添加,稍后我最终会遇到一些数据库插入问题(主键重复)...使用hashSet的目的是连接到这些数据库插入(避免键冲突)。

我可能错过了HashSet的一些属性吗?即使我在添加(.Add)之前尝试检查(.Contains),我最终也会添加hashCode重复...

3 个答案:

答案 0 :(得分:26)

因为HashSet<T>成员资格基于对象相等,而不是哈希代码相等。只要成员根据HashSet<T>不同,Equals的每个成员都具有相同的哈希码是完全合法的。哈希码在HashSet<T>中发挥的作用是快速测试成员资格。如果您有一个对象且其哈希码不在HashSet<T>中,那么您就知道该对象不在HashSet<T>中。如果你有一个对象并且它的哈希代码在HashSet<T>中,那么你必须使用相同的哈希代码来测试对象链,使用Equals来检查对象是否实际在是HashSet<T>还是不。这就是平衡哈希码分布很重要的原因。但事实并非需要唯一的哈希码。

答案 1 :(得分:10)

重写GetHashCode是不够的。您还需要覆盖Equals函数。

答案 2 :(得分:1)

使用hashsets来尝试避免重复值。使用它们来平衡哈希表!

相关问题