我一直在寻找一个错误,我有一本字典,坚持说一把钥匙不存在,尽管它的比较实际上说它确实存在。例如,在以下代码段中,抛出了异常:
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
类实现了正确的GetHashCode
和Equals
方法。
这里有什么我可能会遗失的吗?我完全失败了!
答案 0 :(得分:7)
唯一可能发生的方法是,如果密钥是可变的,并且在将内容插入字典后,其内容已经更改。
以下是它的发生方式:
Equals
解决冲突ContainsKey
。字典在其新存储桶中查找密钥。由于密钥不存在,因此报告了false
foreach
循环中受到欢迎的原因。