此站点上有几个问题,说明词典没有保证的迭代顺序(这是典型的哈希表)。但是,我在为Dictionary类证明这一点时遇到了麻烦:
var dict = new Dictionary<string, int>();
var rand = new Random();
var randomList = Enumerable.Range(1, 1000)
.Select(i => new { x = rand.NextDouble().ToString(), i })
.ToArray();
foreach (var t in randomList) { dict[t.x] = t.i; }
Console.WriteLine(dict.Values.SequenceEqual(randomList.Select(t => t.i))); // prints True
这是Dictionary类的一些未记录的行为吗?或者我只是错过了我的例子?
编辑:很奇怪,这种行为会保持一段时间,但最终会随着字典变大而停止。截止似乎是33899(仍然打印为真,而33900则打印为假)。我想这可能与此特定示例中的哈希冲突有关。答案 0 :(得分:3)
Per MSDN(强调我的):
出于枚举的目的,字典中的每个项都被视为 表示值及其值的
KeyValuePair<TKey, TValue>
结构 键。 退回商品的顺序未定义。
因此虽然它看起来可能是一致的,但不能保证它在将来或实施过程中都会保持这种状态。
答案 1 :(得分:3)
无法保证Dictionary的迭代顺序。在实践中,这意味着此刻确实以一致的方式迭代,但在未来可能会发生变化。
如果您编写的代码依赖于以确定性方式迭代字典,那么如果因为MS建议不依赖它而打破未来的.NET版本,则会出现问题。