2012-05-25 4 views
2

Когда я добавляю запись в Dictionary с использованием Add, в конце ее добавляется KeyValuePair. Я хотел бы приподнять его таким образом, когда я повторяю на KeyValuePair, это первый элемент.Как вставить пару ключ/значение в словарь?

Есть ли способ сделать это с помощью Dictionary или мне нужно построить List<KeyValuePair<TKey, TValue>> или у вас есть лучшее предложение?

EDIT: Я думал, что смогу работать над перечислением в Dictionary, кажется, я не могу.

Я пробовал с List<KeyValuePair<TKey, TValue>>, который был не очень практичным.

ответ

12

Класс Dictionary не имеет понятия порядка в нем - для Dictionary нет позиционного индекса.

Посмотрите на класс OrderedDictionary в пространстве имен System.Collections.Specialized, если вам нужно использовать позиционный индекс в словаре.

+0

Вы говорите о позиционном индексе; однако на основе ключа есть индекс. –

+0

@ OlivierJacot-Descombes - Спасибо вам за ваш комментарий. Уточненный ответ. – Oded

+0

Есть ли общая версия 'OrderedDictionary'? То, что я прошу, - это безопасный тип (общий) словарь, в котором пары ключ-значение упорядочиваются как «Список <>» (** не **, отсортированный по ключу). –

3

OrderedDictionary.

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

3

Если вы хотите сохранить заказ, Dictionary - это не та коллекция, которую вы хотите использовать (у нее нет концепции заказа).

Существует коллекция OrderedDictionary, которая поможет, если вам нужен индексированный словарь.

Существует также коллекция SortedDictionary, которая сортирует значения, которые вы добавляете, на основе значения ключа.

0

Официально, вы никогда не можете знать, в каком порядке ваши пары ключ-значение выйдет из Dictionary<,>, если вы итерацию через него (foreach его, тем самым вызывая GetEnumerator()). И, конечно, если у вас есть Remove некоторые предметы из вашего словаря, а затем Add некоторые другие предметы, когда вы пройдете через коллекцию, новые предметы будут находиться в пространстве удаленных предметов, не в конце итерации "список".

Но: Если вы знаете, что вы никогда не Delete от вашего Dictionary<,>, похоже, перечисление дает элементы в том порядке, в котором они были добавлены. Нет гарантии, что это всегда будет работать, но похоже, что оно работает в текущей реализации.

Так если смей полагаться на это, вы могли бы просто сказать

foreach (var keyValuePair in myDict.Reverse()) 
{ 
    ... 

Метод Reverse является частью LINQ (требуется using System.Linq).

Смежные вопросы