4

该站点上有几个问题指出字典没有保证的迭代顺序(这是哈希表的典型特征)。但是,我无法为 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(仍然打印为 true,而 33900 打印为 false)。我想这可能与这个特定示例中的哈希冲突有关。

4

2 回答 2

4

不保证 Dictionary 的迭代顺序。在实践中,这意味着目前确实以一致的方式迭代,但在未来可能会改变。

如果您编写的代码依赖于以确定性方式迭代的 Dictionary ,那么如果这与未来的 .NET 版本中断,因为 MS 建议不要依赖它,这就是您的问题。

于 2013-10-31T01:23:09.597 回答
3

根据MSDN(强调我的):

出于枚举的目的,字典中的每个项目都被视为KeyValuePair<TKey, TValue>表示值及其键的结构。返回项目的顺序是未定义的

因此,虽然它可能看起来是一致的,但不能保证它在未来或跨实现时会保持这种状态。

于 2013-10-31T01:22:02.577 回答