このサイトには、辞書には保証された反復順序がないことを示すいくつかの質問があります (これはハッシュ テーブルの典型です)。ただし、 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 が出力されます)。これは、この特定の例でのハッシュの衝突に関連している可能性があると思います。