OrderedDictionary и словарь

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

для целей перечисления, каждый элемент в словаре трактуется как 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 в том же порядке, или я должен использовать индекс ?

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