Dictionary中包含longs的类的唯一键

时间:2011-11-19 23:12:15

标签: c#

如果我想将此类的对象用作词典中的键,我还需要做什么? (10.0,20.0)不应该作为密钥存在两次。

public class IntPoint
{
    public Int64 X { get; set; }
    public Int64 Y { get; set; }

    public IntPoint(Int64 X, Int64 Y)
    {
        this.X = X; this.Y = Y;
    }

    public override int GetHashCode()
    {
        return X.GetHashCode() ^ Y.GetHashCode();
    }
}

修改

public static Dictionary<IntPoint, List<int>> GetPolygonDuplicateIndixes(Polygon p)
{
    Dictionary<IntPoint, List<int>> d = new Dictionary<IntPoint, List<int>>();
    int i = 0;
    foreach(IntPoint point in p)
    {
        if(!d.ContainsKey(point))
        {
            d[point] = new List<int>();
        }
        d[point].Add(i);
        i++;
    }
    ...

我在d中得到重复。为什么? 22002,1501在p。

中出现两次

3 个答案:

答案 0 :(得分:6)

如果查看Dictionary documentation,您会看到如果密钥实现了 IEquatable,将使用相等的实现。

答案 1 :(得分:2)

您的GetHashCode可能如下所示:

public override int GetHashCode()
{
    return X.GetHashCode() ^ Y.GetHashCode();
}

但您仍需要覆盖Equals并实施IEquatable界面。

您也可以使用Tuple<Int64, Int64>而不是自己的IntPoint类(如果您使用的是.NET 4.0)。

答案 2 :(得分:2)

MSDN的以下链接建议使用XOR操作组合X和Y

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx#Y1500

public override int GetHashCode() {
  return X ^ Y;

}

要记住的是

  1. 哈希计算很快很重要
  2. 如果两个对象相等,则哈希值相等,但具有相同哈希的两个对象不一定必须相等