О проекте

Я искал способ, чтобы мой Dictionary перечислил его ************ в том же порядке, в котором они были добавлены. Теперь словарь doc четко заявляет, что:

Для целей перечисления каждый элемент в словаре рассматривается как структура ************, представляющая значение и его ключ. Порядок возврата элементов - undefined.

Я узнал, что мне нужен был 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);
}
</string,></string,>

Вывод:

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

Как вы можете видеть, оба заказаны и поднимают 2 вопроса: В каком случае Dictionary дает другой порядок, который тот, в который добавлены значения? Мой первый цикл foreach заставляет меня получить мой ************ в том же порядке или мне нужно использовать индекс?

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);
}
</string,></string,>

печатает нечто похожее на (OrderedDictionary всегда упорядочен):

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

licensed under cc by-sa 3.0 with attribution.