【问题标题】:Dictionary does not contain key despite Comparer.Equals returning true尽管 Comparer.Equals 返回 true,但字典不包含键
【发布时间】:2018-07-09 16:29:36
【问题描述】:

我一直在寻找一个错误,我有一本字典坚持说一个键不存在,尽管它的比较器实际上说它存在。比如下面的sn-p,就抛出了异常:

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");
        }
    }
}

字典是一个通用的Dictionary<TKey, TValue>,带有默认的相等比较器(空构造函数)。 TKey 类实现了正确的 GetHashCodeEquals 方法。

这里有什么我可能遗漏的吗?我完全不知所措!

【问题讨论】:

标签: c# .net dictionary equality


【解决方案1】:

发生这种情况的唯一方法是键是可变的,并且在插入字典后其内容已更改。

这是如何发生的:

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

【讨论】:

  • 确实如此! GetHashCode 依赖于一个可变属性。快把我逼疯了,谢谢!
猜你喜欢
  • 2017-12-01
  • 2012-12-08
  • 2019-03-22
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多