Как вставить в качестве первого элемента в словаре? - PullRequest
10 голосов
/ 23 сентября 2011

У меня есть словарная структура с несколькими парами ключ-значение внутри.

myDict.Add(key1, value1);
myDict.Add(key2, value2);
myDict.Add(key3, value3);

Мой словарь используется в качестве источника данных для некоторого элемента управления.В раскрывающемся списке элемента управления я вижу, что элементы выглядят следующим образом:

key1
key2
key3

Порядок выглядит идентично моему словарю.Я знаю, что Словарь не похож на arrayList - вы можете получить индекс или около того.Я не могу использовать sortedDictionary.Теперь мне нужно добавить еще одну пару ключ-значение в этот словарь в какой-то момент моей программы, и я надеюсь, что он будет иметь тот же эффект, что и я:

myDict.Add(newKey, newValue);
myDict.Add(key1, value1);
myDict.Add(key2, value2);
myDict.Add(key3, value3);

Если я сделаю это, я знаю, что newKeyотобразить в моем элементе управления в качестве первого элемента.

У меня есть идея создать tempDict, поместить каждую пару в myDict в tempDict, затем очистить myDict, а затем добавить пары обратно, как показано ниже:* Есть ли лучший способ, чем этот?

Спасибо!

Ответы [ 5 ]

20 голосов
/ 23 сентября 2011

Dictionary<K,V> не имеет не заказа.Любое воспринимаемое поддержание порядка происходит случайно (и является артефактом конкретной реализации, включая, но не ограничиваясь, порядок выбора и количество сегментов).

Это подходы (просто использование BCL Библиотеки базовых классов).) Я знаю о:

  1. Lookup<K,V>
    • .NET4, неизменяемый, может сопоставлять ключи с несколькими значениями (следите за дубликатами во время сборки)
  2. OrderedDictionary
    • Старые, неуниверсальные, ожидаемые границы производительности словаря (два других подхода O(n) для "get (key)) / set (key) ")
  3. List<KeyValuePair<K,V>>
    • .NET2 / 3 все в порядке, изменяемые, более легкие, могут отображать ключи на несколько значений (следите за дубликатами)во вставках)

Счастливое кодирование.


Создание хеш-структуры данных, поддерживающей порядок вставки, на самом деле является лишь незначительной модификацией стандартного хэшареализация (хэши Ruby теперь поддерживают порядок вставки);однако это не было сделано в .NET и, что более важно, оно не является частью контракта Dictionary / IDictionary.

5 голосов
/ 23 сентября 2011

Вы не можете сделать это с классом Dictionary.Это работает в вашем примере из-за особенностей способа реализации структуры данных.Структура данных фактически сохраняет записи во временном порядке в одном массиве, а затем использует другой массив для индексации в массиве записей.Перечисления основаны на массиве записей.Вот почему он, кажется, заказан в вашем случае.Но если вы примените серию операций удаления и вставки, вы заметите, что этот порядок нарушается.

Вместо этого используйте KeyCollection Он обеспечивает получение O (1) по ключу и индексу и сохраняет временное упорядочение.

2 голосов
/ 23 сентября 2011

со страницы MSDN в словаре (TKey, TValue):

В целях перечисления каждый элемент в словаре обрабатывается как структура KeyValuePair <(Of <(TKey, TValue>)>), представляющая значение и его ключ. Порядок возврата товаров не определен.

Я предполагаю, что вы не можете использовать SortedDictionary, потому что элемент управления зависит от вашего источника данных, являющегося Словарём. Если элемент управления ожидает и тип словаря, и отсортированные данные, элемент управления необходимо изменить, поскольку эти два критерия противоречат друг другу. Вы должны использовать другой тип данных, если вам нужна функция сортировки / упорядочения. В зависимости от неопределенного поведения возникает проблема.

1 голос
/ 23 сентября 2011

Словарь Не должен использоваться для сортировки объектов, он должен использоваться для поиска объектов. Я хотел бы предложить что-то еще, если вы хотите, чтобы это тоже сортировало объекты.

Если вы расширяете словарь, нет правила, которое бы мешало ему смешивать ваш список.

1 голос
/ 23 сентября 2011

Не используйте словарь - нет гарантии, что порядок ключей не изменится, когда вы добавите дополнительные элементы.Вместо этого определите класс Pair для ваших пар ключ-значение (смотрите здесь Что такое C # аналог C ++ std :: pair? в качестве примера) и используйте List<Pair> в качестве источника данных.В List есть операция Insert, которую вы можете использовать для вставки новых элементов в любом месте вашего списка.

...