迭代通过Dictionary时的KeyNotFoundException

时间:2014-03-24 13:07:20

标签: c# exception dictionary key

我有一段看似简单的代码,一直在抛出我不希望出现的错误:

// Private member
private Dictionary<InputField, bool> m_Completed;

// Later on, during some method
foreach (InputField filter in this.m_Completed.Keys)
    if (this.m_Completed[filter])
        completedCount += 1;

我得到的错误:

KeyNotFoundException: The given key was not present in the dictionary

这来自循环中的“if”语句。

对我来说,这意味着迭代器已经与dict的实际键失去同步。这可能吗?没有线程在进行。

我的工作流程错了吗?我可以想一些其他方法来计算,但我仍然想知道为什么我的代码会抛出错误。

1 个答案:

答案 0 :(得分:1)

InputField或其中一个基类以某种方式实现GetHashCode,使得它不会在实例的生命周期内返回相同的值。

这完全打破了DictionaryHashSet的功能,它依赖于一致的哈希码。

因此,一种可能的解决方案是让您的InputField覆盖GetHashCodeEquals。如果它已经覆盖了这些,那么您需要修复实现。

您将在Eric Lippert的博客文章Guidelines and rules for GetHashCode中找到很好的指南,以证明其正确实施。

在这种情况下,这是当前实施中似乎缺少的准则:

  

指南:GetHashCode返回的整数永远不会改变

     

理想情况下,可变对象的哈希码应仅从不能变异的字段计算,因此对象的哈希值在其整个生命周期内都是相同的。