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

BuZ*_*uZz 8 c# hashset

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

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

jas*_*son 26

因为HashSet<T>成员资格基于对象相等,而不是哈希代码相等.HashSet<T>只要成员根据不同的情况,拥有相同哈希码的每个成员都是完全合法的Equals.哈希码所起的作用HashSet<T>是快速测试成员资格.如果你有一个对象并且它的哈希码不在HashSet<T>,那你知道该对象不在HashSet<T>.如果你有一个对象并且它的哈希代码在HashSet<T>那里,那么你必须使用相同的哈希代码测试相等的对象链,Equals以查看对象是否实际HashSet<T>存在.这就是平衡哈希码分布很重要的原因.但并非需要唯一的哈希码.

  • 您正在谈论实施细节.HashSet是一个集合,成员资格由Equals相等确定.只是它使用哈希代码来提高性能.阅读我的答案,我已经指出了你描述的机制.请删除downvote. (4认同)

Gia*_*971 10

覆盖GetHashCode是不够的.您还需要覆盖Equals函数.