1

C# HashSet 定义了许多集合运算符,例如需要将元素与另一个集合进行比较的 exceptWith(...)。这些方法是基于它们正在比较的对象的 HashCode 工作,还是使用 Equals()?

4

1 回答 1

4

与哈希码有关的任何事情都应该使用GetHashCodeand Equals(无论是直接在候选值上调用它们还是通过IEqualityComparer<T>)。

哈希码不能保证是唯一的:它们只是一个有效的初始过滤器。如果两个对象相等,那么它们的哈希码必须相同......但仅仅因为哈希码相同并不意味着它们绝对相等。

哈希码用于非常快速地将大量可能的匹配项缩小到具有相同哈希码的非常小的候选集。(散列集记住元素和它们的散列码,因此可以检查散列码而无需每次都重新计算它们。)然后必须依次检查每个候选者Equals以确定它是否真的匹配

HashTable和中使用了相同的逻辑Dictionary,尽管在实现上可能存在细微差别。(关于哈希表的维基百科文章列出了几种变体。)

于 2013-05-01T20:31:07.193 回答