С# ассоциативный массив
Я использую 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"]
Как я могу это сделать?
Ответы
Ответ 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.
Ответ 8
См. Indexers: http://msdn.microsoft.com/en-us/library/6x16t2tx.aspx
Ответ 9
Один из вариантов заключается в том, чтобы сохранить упорядоченные значения ключей в упорядоченной структуре, например List, а остальная часть все еще хранится в dictionnary.
Затем, когда вам нужно получить доступ к своим данным, просто просмотрите отсортированный список и запросите свой словарь по пути.
Ответ 10
посмотреть отсортированный список
http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx