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

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

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"] 

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

23
задан Noldorin 6 January 2010 в 23:42
поделиться

7 ответов

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

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

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

21
ответ дан 29 November 2019 в 02:34
поделиться

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

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

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

12
ответ дан 29 November 2019 в 02:34
поделиться

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

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

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

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

0
ответ дан 29 November 2019 в 02:34
поделиться

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

SortedList sl = new SortedList ();

foreach (DictionaryEntry x in sl) {}

0
ответ дан 29 November 2019 в 02:34
поделиться

Использование KeyedCollection

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

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

0
ответ дан 29 November 2019 в 02:34
поделиться

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

-1
ответ дан 29 November 2019 в 02:34
поделиться

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

-1
ответ дан 29 November 2019 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: