Подтвердить что ты не робот

О проекте

Я искал способ, чтобы мой 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
...

Как видите, оба заказаны, и это поднимает два вопроса:

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

4b9b3361

Ответ 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