字典中包含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.
如果您查看Dictionary文档,您将看到如果键实现
以下来自MSDN的链接建议使用异或操作组合X和Y
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx Y1500
public override int GetHashCode() {
return X ^ Y;
}
要记住的是
- 哈希计算快是很重要的
- 如果两个对象相等,则它们的哈希值一定相等,但具有相同哈希值的两个对象不一定必须等于
你的GetHashCode可以看起来像:
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode();
}
但是您仍然需要覆盖Equals
并实现IEquatable
接口。
你也可以使用Tuple<Int64, Int64>
代替你自己的IntPoint
类(如果你是在。net 4.0)。