我有一个神秘的情况涉及一个字典,我从字典中枚举键,但字典不包含它说它包含的一些键.
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);