使具有相同值的对象</mytype>的HashSet <mytype>不同

时间:2012-08-06 16:53:17

标签: c#

我已经覆盖了Equal(Object comparee)方法但是当我向HashSet添加对象时,我仍然会得到双打。我错过了什么? MyType类型包含两个int字段(让我们说)。 HashSet可能是错误的集合类型吗?

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

2 个答案:

答案 0 :(得分:3)

覆盖GetHashCode()时,您应始终覆盖Equals()。我通常会为该方法返回某种主键(如果可用)。否则,您可以查看this thread以了解实施它的想法。

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

  • 如果两个条目具有不同的哈希码,则它们肯定不是 相等。
  • 如果两个条目具有相同的哈希码,则它们可能相等,因此请调用 Equals()可以确定。

答案 1 :(得分:2)

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

并且不要懒惰并且对所有这些都使用相同的哈希码;这会破坏HashSet的目的。

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

public override int GetHashCode() {
    return field1 ^ field2;
}