自定义颜色类不能用作词典键

时间:2013-11-17 15:43:22

标签: c# dictionary keynotfoundexception

我使用自定义类作为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,但我仍然想知道为什么当我能想到的每一个测试成功时,这都不会起作用。

0 个答案:

没有答案