So-net無料ブログ作成
検索選択

.NET Framework のDictionaryを列挙した時の順番 [日記]

.NET Framework に含まれているDictionaryクラス(ジェネリック版)、JavaでのHashTableクラスに相当するのかと思ったら、実はLinkedHashMapの方じゃないかと思えてきた。

理由は単純で、Dictionaryに登録したデータを列挙すると、登録した順番で値を取ってきているっぽいから。

試しに、こんなコードを書いてみました。

    var table = new Dictionary<string, int>();
    for (int i = 0; i < 100; i++) {
        table.Add(i.ToString(), i);
    }
    foreach (var item in table) {
        Console.WriteLine(item.Key);
    }

すると、0, 1, 2, … と表示されます。

コレだけなら、ハッシュ関数が偶々そういう風になっていただけとも取れるので、こんなコードでも試してみました。

    var table = new Dictionary<string, int>();
    for (int i = 0; i < 100; i++) {
        table.Add((99 - i).ToString(), i);
    }
    foreach (var item in table) {
        Console.WriteLine(item.Key);
    }

すると、99, 98, 97, … と表示されます。

こうなってくると、「ハッシュ値が全部同じ」というありえない状況以外、列挙した時のデータの順番は登録した順番になるようになっているとしか思えないのです。

そこで、MSDNを確認してみました。

アイテムが返される順序は未定義です。

そんなわけで、逆コンパイルしてみました。

………。

データの追加しかしないなら、データの列挙順はデータの登録順です。

もっとも、仕様上は「未定義」なのだから、いつなんどき順番が変わるか分かりませんが。

あ、今回確認したのは .NET framework 3.5 です。


タグ:.net
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0