OrderedDictionaryと辞書 質問する

OrderedDictionaryと辞書 質問する

私は、追加された順番にDictionary列挙する方法を探していました。KeyValuePair辞書のドキュメント明確に次のように述べています。

列挙の目的で、辞書内の各項目は、KeyValuePair<TKey, TValue>値とそのキーを表す構造体として扱われます。項目が返される順序は未定義です。

必要なのは だとわかりましたOrderedDictionaryが、私は懐疑的なので、自分で試してみることにしました。

OrderedDictionary od = new OrderedDictionary();
Dictionary<String, String> d = new Dictionary<String, String>();

for (int i = 0; i < 10; i++)
{
    od.Add("key" + i, "value" + i);
    d.Add("key" + i, "value" + i);
}

System.Console.WriteLine("OrderedDictionary");
foreach (DictionaryEntry de in od) {
    System.Console.WriteLine(de.Key + ", " + de.Value);
}

System.Console.WriteLine("Dictionary");
foreach (var tmp in d) {
    System.Console.WriteLine(tmp.Key + ", " + tmp.Value);
}

出力:

OrderedDictionary
key0, value0
key1, value1
key2, value2
...

Dictionary
key0, value0
key1, value1
key2, value2
...

ご覧のとおり、両方とも順序付けられており、次の 2 つの疑問が生じます。

どの場合に、Dictionary値が追加された順序とは異なる順序が与えられますか? 最初のforeachループで同じ順序で取得されることが保証されますかKeyValuePair、それともインデックスを使用する必要がありますか?

ベストアンサー1

やり方が間違っています。辞書に値を順番に挿入するだけでなく、いくつかの要素を削除して、その後順序がどのように変化するかを確認する必要があります。次のコードはこれを示しています。

OrderedDictionary od = new OrderedDictionary();
Dictionary<String, String> d = new Dictionary<String, String>();
Random r = new Random();

for (int i = 0; i < 10; i++)
{
    od.Add("key" + i, "value" + i);
    d.Add("key" + i, "value" + i);
    if (i % 3 == 0)
    {
        od.Remove("key" + r.Next(d.Count));
        d.Remove("key" + r.Next(d.Count));
    }
}

System.Console.WriteLine("OrderedDictionary");
foreach (DictionaryEntry de in od) {
    System.Console.WriteLine(de.Key + ", " +de.Value);
}

System.Console.WriteLine("Dictionary");
foreach (var tmp in d) {
    System.Console.WriteLine(tmp.Key + ", " + tmp.Value);
}

次のようなものを出力します (OrderedDictionary は常に順序付けられます)。

OrderedDictionary
key3, value3
key5, value5
key6, value6
key7, value7
key8, value8
key9, value9
Dictionary
key7, value7
key4, value4
key3, value3
key5, value5
key6, value6
key8, value8
key9, value9

おすすめ記事