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 の反復順序は保証されません。実際には、これは現時点では一貫した方法で反復することを意味しますが、将来的には変更される可能性があります。

決定論的な方法で反復するディクショナリに依存するコードを作成する場合、MS がそれに依存しないようにアドバイスしているため、将来の .NET リリースでそれが壊れた場合、それはあなたの問題です。

于 2013-10-31T01:23:09.597 に答える
3

MSDNごと(強調鉱山):

KeyValuePair<TKey, TValue>列挙のために、ディクショナリ内の各項目は、値とそのキーを表す構造体として扱われます。アイテムが返される順序は定義されていません

したがって、一貫しているように見えるかもしれませんが、将来または実装間で一貫しているとは限りません。

于 2013-10-31T01:22:02.577 に答える