C#字典<;TKey,TValue>;保证迭代顺序?

C#字典<;TKey,TValue>;保证迭代顺序?,c#,dictionary,C#,Dictionary,这个网站上有几个问题指出字典没有保证的迭代顺序(这是哈希表的典型情况)。但是,在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 }) .T

这个网站上有几个问题指出字典没有保证的迭代顺序(这是哈希表的典型情况)。但是,在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
var dict=newdictionary();
var rand=new Random();
var randomList=可枚举范围(11000)
.Select(i=>new{x=rand.NextDouble().ToString(),i})
.ToArray();
foreach(vart在随机列表中){dict[t.x]=t.i;}
Console.WriteLine(dict.Values.SequenceEqual(randomList.Select(t=>t.i));//打印正确
这是Dictionary类的未记录行为吗?或者我只是在我的例子中遗漏了什么

编辑:奇怪的是,这种行为会保持一段时间,但最终会随着字典变大而停止。截止值似乎是33899(仍然打印为真,而33900打印为假)。我想这可能与此特定示例中的哈希冲突有关。

Per(强调我的):

出于枚举的目的,字典中的每一项都被视为 表示值及其属性的
KeyValuePair
结构 钥匙返回项目的顺序未定义


因此,尽管它看起来是一致的,但不能保证它在将来或在实现过程中保持一致。

字典的迭代顺序不能保证。在实践中,这意味着目前In确实以一致的方式进行迭代,但在将来可能会发生变化


如果您编写的代码依赖于以确定性方式进行的字典迭代,那么如果在将来的.NET版本中出现这种情况,那就是您的问题,因为MS建议不要依赖它。

这是一种有文档记录的行为。文档中说,它按照自己选择的顺序生成这些对,并且确实如此。