C # ассоциативный массив - PullRequest
       34

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

22 голосов
/ 16 декабря 2009

Я использовал 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"] 

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

Ответы [ 10 ]

21 голосов
/ 16 декабря 2009

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

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

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

12 голосов
/ 16 декабря 2009

РЕДАКТИРОВАТЬ: Л.Бушкин прав - OrderedDictionary выглядит так, как будто это работает, хотя и не в общем виде. Забавно, сколько существует специализированных коллекций, у которых нет общих эквивалентов :( (Малфисту имеет смысл изменить принятый ответ на ответ Л.Бушкина.)

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

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

1 голос
/ 16 декабря 2009

До .NET 4.0 нет идеального решения. В <3.5 Вы можете: </p>

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

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

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

0 голосов
/ 05 апреля 2013

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

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

0 голосов
/ 17 августа 2012
0 голосов
/ 15 мая 2012

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

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

См. Эту ссылку MSDN для получения дополнительной информации о том, как ее использовать.

0 голосов
/ 07 января 2010

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

0 голосов
/ 16 декабря 2009

Используйте KeyedCollection

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

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

0 голосов
/ 16 декабря 2009

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

SortedList sl = новый SortedList ();

foreach (DictionaryEntry x в sl) {}

0 голосов
/ 16 декабря 2009

посмотреть отсортированный список http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx

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