2011-02-03 65 views
6

我有一个看起来像这样的类。c#使用类对象作为字典中的键

public class Point : IEquatable<Point> 
{ 
    public int _xValue {get;set;} 
    public double _yValue {get;set;} 

    public Point(int x, double y) 
    { 
     _xValue = x; 
     _yValue = y; 
    } 

    public override bool Equals(object obj) 
    { 
     return Equals(obj as Point); 
    } 

    public bool Equals(Point obj) 
    { 
     return obj != null && obj._xValue == this._xValue && obj._yValue == this._yValue; 
    } 


} 

我要实现的功能GetHashCode,这样我可以用它作为字典键。但是我不清楚在这种情况下GetHashCode函数必须返回什么。有人可以帮我吗?

+0

难道这就是你在找什么? http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode – 2011-02-03 05:33:56

+0

美丽。谢谢 – Aks 2011-02-03 05:36:03

+0

@astander:当一个问题已经被问及之前回答时,将其标记为一个蠢货。你有很多代表。 (或者你今天没票了吗?) – 2011-02-03 05:51:12

回答

4

它应该返回一个整数,最好对每个单独的对象实例都是唯一的。散列值基本上是一个由对象内容创建的单个数字,用于唯一标识该对象。第一条规则是,如果其中两个点评估为彼此相等,那么这两个点的散列值应该相同。

的更详细描述可在MSDN

2

的GetHashCode的函数需要返回点整数,将唯一地识别从另一对象的一个​​实例,以避免冲突时,它被用作在字典中的一个关键。

您应该能够可靠地重现哈希码,所以尽量避免使用随机或日期值作为哈希码的种子。

0

在你的情况,你可以这样做:

return x^y;

1

你可以做_xValue^_yValue.GetHashCode()

1

有一些基本的规则是:

  • 布尔:如果真实返回0,否则返回1
  • 字节,炭,short或者int:返回类型的值
  • :回报(INT)(F^F(>>> 32))
  • 浮法:返回Convert.ToInt32返回通过调用object.GetHashCode()
  • 阵列生成的值::类型
  • 对象的值的迭代所有阵列和单独地对待每个元素

所以在你的情况下,你有x = int和y = double,如果你遵循这个规则,你会找到解决方案。

return x^y.GetHashCode();

你总是可以添加奇特的数学算法,但要小心数值碰撞。