字典中包含long的类的唯一键

本文关键字:一键 唯一 long 包含 字典 | 更新日期: 2023-09-27 18:15:09

如果我想使用这个类的对象作为Dictionary中的键,我需要做什么?(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.

字典中包含long的类的唯一键

中出现两次

如果您查看Dictionary文档,您将看到如果键实现

以下来自MSDN的链接建议使用异或操作组合X和Y

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

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

}

要记住的是

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

你的GetHashCode可以看起来像:

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

但是您仍然需要覆盖Equals并实现IEquatable接口。

你也可以使用Tuple<Int64, Int64>代替你自己的IntPoint类(如果你是在。net 4.0)。