辞書が「順序付けられていない」のはなぜですか? 質問する

辞書が「順序付けられていない」のはなぜですか? 質問する

私はここで多くの質問に対する答えとしてこれを読みました。しかし、それは正確にはどういう意味ですか?

var test = new Dictionary<int, string>();
test.Add(0, "zero");
test.Add(1, "one");
test.Add(2, "two");
test.Add(3, "three");

Assert(test.ElementAt(2).Value == "two");

上記のコードは期待通りに動作するようです。では、辞書はどのような場合に順序なしと見なされるのでしょうか? どのような状況で上記のコードが失敗する可能性がありますか?

ベストアンサー1

まあ、まずこれが挿入順序またはキー順序たとえば、次のように記述した場合、どのような結果が期待されるでしょうか。

var test = new Dictionary<int, string>();
test.Add(3, "three");
test.Add(2, "two");
test.Add(1, "one");
test.Add(0, "zero");

Console.WriteLine(test.ElementAt(0).Value);

「3」を期待しますか、それとも「0」を期待しますか?

実は私は考える現在の実装では、何も削除しない限り挿入順序は保持されますが、これに頼ってはならないこれは実装の詳細であり、将来変更される可能性があります。

削除もこれに影響します。たとえば、このプログラムの結果はどうなると思いますか?

using System;
using System.Collections.Generic;

class Test
{ 
    static void Main() 
    {
        var test = new Dictionary<int, string>();
        test.Add(3, "three");
        test.Add(2, "two");
        test.Add(1, "one");
        test.Add(0, "zero");

        test.Remove(2);
        test.Add(5, "five");

        foreach (var pair in test)
        {
            Console.WriteLine(pair.Key);
        }
    }     
}

実際は (私のボックスでは) 3、5、1、0 です。5 の新しいエントリは、以前 2 で使用されていた空いたエントリを使用しています。ただし、これも保証されません。

再ハッシュ (辞書の基礎となるストレージを拡張する必要がある場合) は、さまざまなものに影響を及ぼす可能性があります... さまざまなことが影響します。

順序付きコレクションとして扱わないでください。そのために設計されていません。たとえ今はうまく動作しているとしても、クラスの目的に反する、文書化されていない動作に依存していることになります。

おすすめ記事