c# – 字典KeyCollection奇怪

我有一个神秘的情况涉及一个字典,我从字典中枚举键,但字典不包含它说它包含的一些键.

Dictionary<uint, float> dict = GetDictionary(); // Gets values, 6268 pairs
foreach(uint key in dict.Keys)
{
   if (!dict.ContainsKey(key))
      Console.WriteLine("Wat? "+key);
}

以上将打印6268键中的两个.这两个键没有什么特别之处,两个正值都小于Int32.MaxValue(369099203和520093968).

对计数的检查显示:

Console.WriteLine(dict.Count);                           // 6268
Console.WriteLine(dict.Keys.Count());                    // 6268
Console.WriteLine(dict.Keys.Count(dict.Keys.Contains));  // 6266 

这是在.NET4.5 CLR下运行的单线程.NET4代码.字典是一个香草字典< uint,float>即没有自定义相等比较器.我假设由于uint / int差异而出现哈希问题,但是对于字典的Key集合中返回的所有键,不应该保证ContainsKey(key)为true?特别是当您只在下面的代码片段中查看KeyCollection对象时,总计数和所包含对象的数量都会关闭,这感觉就像一个奇怪的ICollection行为.

编辑:

正如预期的那样,似乎有一个合理的解释:在初始化期间,两个并发线程先前修改了集合.当某些东西“有时会破裂”时,这是一个线索问题,当然.从几个线程访问一个字典显然会扰乱内部状态,使其在其生命周期的剩余时间内保持半功能状态,但不会导致任何异常.

我将切换到并发字典,并可能删除此问题.谢谢.

最佳答案 我没有足够的代表评论 – 但我确实尝试重现你的问题无济于事.我建议您发布GetDictionary()是如何工作的,我建议不要迭代这样的字典,而是在下面做,看看是否似乎解决了这个问题:

foreach (KeyValuePair<uint, float> pair in dict)
    Console.WriteLine("[" + pair.Key + "]=" + pair.Value);
点赞