Добавление элемента словаря в определенном месте - PullRequest
3 голосов
/ 27 октября 2011

Рассмотрим следующий код:

var myDict = new Dictionary<string, int>();

myDict.Add("Key1", 1);
myDict.Add("Key2", 2);
myDict.Add("Key4", 4);
myDict.Add("Key5", 5);

foreach (KeyValuePair<string, int> pair in myDict)
{
    Console.Write(pair.Key + @" --> ");
    Console.WriteLine(pair.Value);
}

myDict.Add("Key3", 3);
foreach (KeyValuePair<string, int> pair in myDict)
{
    Console.Write(pair.Key + @" --> ");
    Console.WriteLine(pair.Value);
}

Что я хочу сделать, это вставить "Key3" между "Key2" и "Key4".Я использую это в качестве примера для простоты.Я знаю, что мог бы использовать SortedDictionary и заставить этот пример работать.Что мне нужно, чтобы иметь возможность делать конкретно, так это то, что всякий раз, когда я вставляю новый элемент в словарь, я ВСЕГДА хочу, чтобы он вставлял его после 2-го элемента и до 3-го элемента.Как мне это сделать?

Ответы [ 6 ]

11 голосов
/ 27 октября 2011

Для этого вы можете использовать OrderedDictionary. OrderedDictionary.Insert позволяет указать индекс, по которому будет вставлен ключ.

3 голосов
/ 27 октября 2011

Там нет понятия "между" в Dictionary<,>. Это неупорядоченное отображение. Повторение этого даст непредсказуемые результаты, которые могут измениться между версиями платформы. Если вы хотите сохранить какой-то порядок, у вас может быть отдельный List<T> или LinkedList<T>, представляющий условный порядок ключей. Вы должны держать их в курсе по отношению друг к другу.

2 голосов
/ 27 октября 2011

Это невозможно при стандартном типе Dictionary<TKey, TValue>.По сути, это неупорядоченная коллекция.Любая попытка гарантировать заказ не будет работать.

С SortedDictionaryTKey, TValue> это может работать, если вы сделаете так, чтобы компаратор знал о месте элементов в Dictionary.Однако это почти наверняка неправильный подход.Это действительно звучит так, как будто вы хотите List<T> здесь ..

2 голосов
/ 27 октября 2011

Класс Dictionary<TKey,TVal>. не имеет понятия отсортированных ключей. Вам нужен SortedDictionary , который будет сортировать ваш словарь по ключу.

1 голос
/ 27 октября 2011

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

1 голос
/ 27 октября 2011

Это не то, для чего предназначен словарь. Словарь не отсортирован по определению. Нет такого понятия, как 2-й или 4-й элемент, так как они доступны только по ключу.

Элементы перечисляются в порядке их добавления просто из-за внутренней реализации Dictionary, используемой конкретной версией CLR, с которой вы работаете (см. здесь , чтобы узнать, как работает словарь на самом деле реализован, чтобы понять, почему он это делает)

Используйте взамен SortedDictionary или SortedList, или, если вы хотите вставить в определенные индексы, сверните свою собственную коллекцию, комбинируя словарь (для поиска ключа O (1)) и список (для поддержания порядка ключей и вставьте по определенному индексу). OrderedDictionary может делать то, что вы ищете, но это не универсальная коллекция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...