尽管Comparer.Equals返回true,但Dictionary不包含键

Laz*_*zlo 3 .net c# dictionary equality

我一直在寻找一个错误,我有一本字典坚持说一个密钥不存在,尽管它的比较实际上说它确实存在.例如,在以下代码段中,抛出异常:

if (!dictionary.ContainsKey(key))
{
    var comparer = dictionary.Comparer;

    foreach (var _key in dictionary.Keys)
    {
        if (comparer.Equals(key, _key) &&
            comparer.Equals(_key, key) &&
            comparer.GetHashCode(key) == comparer.GetHashCode(_key) &&
            comparer.GetHashCode(_key) == comparer.GetHashCode(key))
        {
            throw new Exception("Key exists, but dictionary doesn't find it");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

字典是Dictionary<TKey, TValue>默认的相等比较器(空构造函数)的泛型.在TKey类实现正确GetHashCodeEquals方法.

这里有什么我可能会遗失的吗?我完全失败了!

das*_*ght 7

这种情况发生的唯一方法是,如果密钥是可变的,并且在将内容插入字典后,其内容已经更改.

以下是它的发生方式:

  • 您将一个键插入字典; 字典获取其哈希码,并将其放入相应的哈希桶中,通过调用解决冲突Equals
  • 你改变了关键; 现在它的哈希码不再对应于它的哈希桶
  • 你打电话ContainsKey.字典在其新存储桶中查找密钥.false据报道,由于钥匙不在那里
  • 迭代字典时,将返回所有键,包括不再位于其合法存储区中的键.这就是你在foreach循环中获得成功的原因.