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