2013-05-22 15 views
38

Dictionary benim KeyValuePair numaranın eklendikleri sırayla numaralandırmasını sağlamanın bir yolunu arıyordum.OrderedDictionary ve Sözlük

numaralandırma amaçları için, sözlükte her öğenin bir değeri ve onun anahtarı temsil eden bir KeyValuePair<TKey, TValue> yapı olarak kabul edilir: Şimdi Dictionary's doc açıkça ifade etmektedirler. Öğelerin iade edildiği sıra tanımsızdır.

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); 
} 

Çıktı:: Size şöyle

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

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

Ben bir OrderedDictionary oldu gerekiyordu ama ben şüpheci olmak, kendim denemeye karar verdi neyi öğrendim Görebilir, her ikisi de sipariş edilir ve bu 2 soru yükseltir:
Bu durumda Dictionary, değerlerin eklendiği farklı bir sıra verir mi? İlk foreach döngüsüm, KeyValuePair numaramı aynı sırayla almamı sağlar mı yoksa dizini mi kullanmalıyım?

+0

deneyin Add'ing 'ederken koleksiyonlara * rastgele * tuşlarını kullanın ve farkı görmek için. – I4V

+0

Sadece bilgi için: @ I4V Bunu denedim ve bu değişmiyor. – DeadlyJesus

cevap

44

Yanlış yapıyorsunuz. Sadece sıralı olarak sözlüğe eklemeler yapmakla kalmaz, aynı zamanda bazı öğeleri de kaldırmanız ve siparişin bundan sonra nasıl değiştiğini görmeniz gerekir. Sonraki kod, bu gösterir:

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); 
} 

baskılar benzer bir şey (OrderedDictionary hep sıralanır):

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

Sadece sözlüğü numaralandırıyorsam ne olur? Anladığım kadarıyla bu durumda aynı şekilde çalışıyorlar. – DeadlyJesus

+0

@DeadlyJesus numaralandırarak kaldırmadan değerler eklemek anlamına mı geliyor? –

+0

Evet. Örneğimde yaptığım şey, uygulamamda yaptığım az çok şey, sözlükte sadece değerler eklemek ve daha sonra bunları kaldırmak/değiştirmek. – DeadlyJesus