C# 制作HashSet<;MyType>;具有相同值的对象之间的差异

C# 制作HashSet<;MyType>;具有相同值的对象之间的差异,c#,C#,我已经重写了Equal(objectcomparee)方法,但当我将对象添加到HashSet时,仍然会得到double。我错过了什么?MyType类型包含两个int字段(假设是这样的)。HashSet可能是错误的集合类型吗 我希望添加一些MyType内容,但集合只存储唯一的内容,其中唯一由我定义(使用Equals方法或任何其他方式) 您还需要覆盖GetHashCode();否则,对象将具有不同的哈希代码,因此将自动假定为不同的。从您的对象中获取一些独特的ish值,并使用这些值(如果可用),或者只

我已经重写了
Equal(objectcomparee)
方法,但当我将对象添加到HashSet时,仍然会得到double。我错过了什么?
MyType
类型包含两个
int
字段(假设是这样的)。
HashSet
可能是错误的集合类型吗


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

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

不要偷懒,也不要对它们使用相同的哈希代码;这将破坏
哈希集的用途

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

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

重写
Equals()
时,应始终重写
GetHashCode()
。我通常会为该方法返回某种主键(如果可用)。否则,您可以查看实现它的想法

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

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

“……不要偷懒,对所有的人都使用相同的哈希代码……”哈哈哈,你看到了,不是吗。好吧,就因为你指出了这一点,我会做一些更高级的事情。然而,有一个问题——建议的提升到幂的散列不会显著影响计算吗?相反,我是求和,这不是指数运算,而是XOR(异或),它很快。看这里:过去几天我一直在和MatLab坐在一起。。。我已经到了羞愧的角落。:)