2

我已经覆盖了Equal(Object comparee)方法,但是当我将对象添加到我的 HashSet 时,我仍然得到双打。我错过了什么?该MyType类型包含两个int字段(假设是这样)。也许是HashSet错误的集合类型?

我希望添加一些MyType东西,但这样集合只存储唯一的东西,其中唯一的由我定义(使用Equals方法或任何其他方式)。

4

2 回答 2

3

GetHashCode()当你覆盖时,你应该总是覆盖Equals()。如果可用,我通常会为该方法返回某种主键。否则,您可以查看此线程以获取实现它的想法。

理解这两种方法之间关系的关键是:

  • 如果两个条目具有不同的哈希码,则它们肯定不相等。
  • 如果两个条目具有相同的哈希码,则它们可能相等,因此请致电 Equals()确定。
于 2012-08-06T16:55:53.363 回答
2

您还需要覆盖GetHashCode();否则,您的对象将具有不同的哈希码,因此将自动被假定为不同。从您的对象中获取一些独特的价值并使用它(如果可用),或者只生成您自己的。

也不要偷懒,对所有这些都使用相同的哈希码;这将破坏 a 的目的HashSet

因此,对于具有两个int字段的示例,您可能会执行以下操作:

public override int GetHashCode() {
    return field1 ^ field2;
}
于 2012-08-06T16:55:05.690 回答