64

追加されたのと同じ順序でDictionary列挙する方法を探していました。KeyValuePairさて、Dictionary のドキュメントには、次のことが明確に記載されています。

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か、それともインデックスを使用する必要がありますか?

4

1 に答える 1

76

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

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
于 2013-05-22T14:23:54.987 に答える