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

С# ассоциативный массив

Я использую Hashtable, но по своей природе хеш-таблицы не упорядочены, и я должен держать все в порядке, когда я их добавляю (потому что я хочу вытащить их в том же порядке). Например, если:

pages["date"] = new FreeDateControl("Date:", false, true, false);
pages["plaintiff"] = new FreeTextboxControl("Primary Plaintiff:", true, true, false);
pages["loaned"] = new FreeTextboxControl("Amount Loaned:", true, true, false);
pages["witness"] = new FreeTextboxControl("EKFG Witness:", true, true, false);

И когда я делаю foreach, я хочу получить его в следующем порядке:

pages["date"]  
pages["plaintiff"]  
pages["loaned"]  
pages["witness"] 

Как я могу это сделать?

4b9b3361

Ответ 1

Я считаю, что .NET имеет класс OrderedDictionary, чтобы справиться с этим. Это не общий, но он может служить достойной заменой Hashtable - если вам не нужна строгая безопасность типов.

Я написал общий обертку вокруг этого класса, который я бы хотел поделиться.

http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx

Ответ 2

EDIT: LBushkin прав - OrderedDictionary похоже, что это трюк, хотя и не общий. Смешно, сколько там специализированных коллекций, которые не имеют общих эквивалентов:( (Было бы разумно, чтобы Малфист изменил принятый ответ на вопрос Л.Бушкина.)

(я думал, что...).NET не имеет ничего встроенного для этого.

В основном вам нужно сохранить List<string>, а также Dictionary<string,FreeTextboxControl>. Когда вы добавляете в словарь, добавьте ключ в список. Затем вы можете перебирать список и находить ключи в порядке ввода. Вы должны быть осторожны при удалении или замене элементов.

Ответ 3

Не существует идеального решения перед .NET 4.0. В < 3.5 Вы можете:

Используйте generic SortedList с целым типом ключа и тип значения наиболее распространенного общего типа ваших элементов. Определите целочисленное значение (i, скажем), и когда вы добавите каждый элемент в SortedList, сделайте ключ я ++, увеличивая его значение по мере продвижения. Позже, перейдите по свойству GetValueList отсортированного списка. Это свойство IList даст ваши объекты в том порядке, в котором вы их вставляете, потому что они будут отсортированы с помощью ключа, который вы использовали.

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

В .NET 4.0 у вас будет общий SortedSet Of T, который будет абсолютно идеальным для вы. Никаких компромиссов.

Ответ 4

использовать отсортированный список, я думаю, он решит вашу проблему поскольку объект SortedList внутренне поддерживает два массива для хранения элементов списка; то есть один массив для ключей и другой массив для связанных значений. Каждый элемент представляет собой пару ключ/значение, к которому можно получить доступ как объект DictionaryEntry

SortedList sl = new SortedList();

foreach (DictionaryEntry x в sl) {}

Ответ 5

Использовать KeyedCollection

Его базовая база - это List, но обеспечивает поиск по словарю на основе ключа. В этом случае ваш ключ - это строки. Так что пока вы не добавляете один и тот же ключ дважды, вы в порядке.

http://msdn.microsoft.com/en-us/library/ms132438.aspx

Ответ 6

Как предполагает Хакселит, вы можете получить от KeyedCollection<TKey, TValue>. Он фактически использует список внизу, пока вы не нажмете определенное пороговое значение, а затем оно будет содержать как список, так и словарь. Если вы можете использовать функцию для получения одного из ваших ключей из одного из ваших значений, то это простое решение. Если нет, тогда это становится довольно грязным.

Ответ 7

Лучший способ - использовать индексы С#. Он настраивается на все, что нам нравится. Мы можем передать int, enum, long, double или все, что нам нравится.

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

Подробнее о том, как его использовать, см. ссылку MSDN.

Ответ 9

Один из вариантов заключается в том, чтобы сохранить упорядоченные значения ключей в упорядоченной структуре, например List, а остальная часть все еще хранится в dictionnary.

Затем, когда вам нужно получить доступ к своим данным, просто просмотрите отсортированный список и запросите свой словарь по пути.