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类实现正确GetHashCode和Equals方法.
这里有什么我可能会遗失的吗?我完全失败了!
这种情况发生的唯一方法是,如果密钥是可变的,并且在将内容插入字典后,其内容已经更改.
以下是它的发生方式:
EqualsContainsKey.字典在其新存储桶中查找密钥.false据报道,由于钥匙不在那里foreach循环中获得成功的原因.