如果我想将此类的对象用作词典中的键,我还需要做什么? (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。
中出现两次答案 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;
}
要记住的是