我已经覆盖了Equal(Object comparee)
方法但是当我向HashSet添加对象时,我仍然会得到双打。我错过了什么? MyType
类型包含两个int
字段(让我们说)。 HashSet
可能是错误的集合类型吗?
我希望添加一些MyType
个东西,但这样集合只存储唯一的,其中unique是由我定义的(使用Equals
方法或任何其他方式)。
答案 0 :(得分:3)
覆盖GetHashCode()
时,您应始终覆盖Equals()
。我通常会为该方法返回某种主键(如果可用)。否则,您可以查看this thread以了解实施它的想法。
理解这两种方法之间关系的关键是:
Equals()
可以确定。答案 1 :(得分:2)
您还需要覆盖GetHashCode()
;否则,您的对象将具有不同的哈希码,因此将自动假设为不同。从您的对象中获取一些独特的值并使用它(如果可用),或者只生成您自己的值。
并且不要懒惰并且对所有这些都使用相同的哈希码;这会破坏HashSet
的目的。
因此,对于包含两个int
字段的示例,您可能会执行以下操作:
public override int GetHashCode() {
return field1 ^ field2;
}