我使用自定义类作为Dictionary对象的键时出现了一个奇怪的问题。
public class MapColor
{
public Byte R;
public Byte G;
public Byte B;
public override int GetHashCode()
{
return (this.R << 16) + (this.G << 8) + this.B;
}
public override bool Equals(object obj)
{
MapColor c = (MapColor)obj;
if (c.R != this.R)
return false;
if (c.G != this.G)
return false;
if (c.B != this.B)
return false;
return true;
}
public override string ToString()
{
return String.Format("RGB = [{0}, {1}, {2}] : {3}", this.R, this.G, this.B, this.GetHashCode());
}
}
正如您所看到的,它只不过是一个包含基本RGB颜色字节的参考类型颜色。我已经覆盖了GetHashCode和Equals,以便将它作为密钥使用。对于我的哈希值,我只是使用从颜色本身生成的值,因此每种颜色都有自己独特的哈希值。
当我运行代码来填充字典时,添加的第一个东西使用直接零的键。该密钥在需要时检索完全正常。当使用不是全零的下一个键时,它会抛出一个KeyNotFound异常。
为了尝试调试它我添加了一个数组来复制键,所以我可以使用基于Int32的索引器,因为我碰巧知道哪个条目应匹配,#171。
MapColor[] keys= new MapColor[byColor.Count];
byColor.Keys.CopyTo(keys, 0);
return byColor[color];
这有点奇怪的是,如果我将颜色与键[171]进行比较,它们与GetHashCode调用,color.Equals甚至是对Object.ReferenceEquals的调用相同,因为它们实际上是对象的相同引用。
随着每一次检查,我可以抛出它回来真实我无法弄清楚为什么byColor.ContainsKey(color)返回false。
我的下一步是尝试创建一个自定义的IEqualityComparer类,在创建时传入Dictionary,但我仍然想知道为什么当我能想到的每一个测试成功时,这都不会起作用。