2013-05-22 14 views
38

Dictionaryは、追加されたのと同じ順番でKeyValuePairを列挙する方法を探していました。OrderedDictionaryとDictionary

列挙の目的のために、辞書内の各項目は、値とそのキーを表すKeyValuePair<TKey, TValue>構造として扱われる:今、Dictionary's docははっきりと述べています。アイテムが返される順序は未定義です。

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 
... 

は私がOrderedDictionaryだっ必要ですが、私は懐疑的であること、私はそれを自分で試してみることに何のことが判明しましたどちらも注文されており、2つの質問が発生します:
この場合、Dictionaryは値が追加された注文と異なる注文ですか? 私の最初のforeachループは私のKeyValuePairを同じ順序で取り出すことを保証しますか、またはインデックスを使用する必要がありますか?

+0

てみAdd'ing 'しばらくコレクションに*ランダム*キーを使用して違いを見るために。 – I4V

+0

情報のみ: @ I4V試してみてください。それは変わりません。 – DeadlyJesus

答えて

44

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

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 
+0

辞書を列挙すればどうなりますか?私が理解していることから、彼らはその場合同じように動作します。 – DeadlyJesus

+0

@DeadlyJesusあなたは削除せずに値を挿入するということを列挙していますか? –

+0

はい。私の例では、多かれ少なかれ、私は自分のアプリで何をしているのですか、私は辞書に値を追加し、後でそれらを削除/変更することはありません。 – DeadlyJesus