Я использовал Хеш-таблицу, но по своей природе, хеш-таблицы не заказаны, и я должен поддерживать все в порядке, как я добавляю их (потому что я хочу вытащить их в том же порядке). 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"]
Как я могу сделать это?
Я считаю, что .NET для этого есть класс OrderedDictionary
. Это не общий, но он может служить достойной заменой Hashtable - если вы не заботитесь о строгой безопасности типов.
Я написал универсальную оболочку для этого класса, которой я хотел бы поделиться.
http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx
РЕДАКТИРОВАТЬ: Л.Бушкин прав - OrderedDictionary
похоже, что он помогает, хотя и не общим способом. Забавно, сколько существует специализированных коллекций, у которых нет общих эквивалентов :( (Малфисту было бы разумно изменить принятый ответ на LBushkin.)
(Я думал, что ...) .NET не имеет что-нибудь встроенное для этого.
В основном вы ' Мне нужно будет сохранить List
, а также Dictionary
. При добавлении в словарь добавьте ключ в список. Затем вы можете просмотреть список и найти ключи в порядке их вставки. Однако при удалении или замене элементов следует соблюдать осторожность.
До .NET 4.0 не было идеального решения. В <3.5 вы можете:
Использовать общий SortedList с целочисленным типом ключа и типом значения наиболее производного общего типа ваших элементов. Определите целочисленное значение (скажем, i) и по мере добавления каждого элемента в SortedList сделайте ключ i ++, увеличивая его значение по мере продвижения. Позже переберите свойство GetValueList отсортированного списка. Это свойство IList будет отображать ваши объекты в том порядке, в котором вы их разместили, потому что они будут отсортированы по ключу, который вы использовали.
Это не молниеносно, но довольно хорошо и универсально. Если вы хотите получить доступ по ключу, вам нужно сделать что-то еще, но я не вижу этого в ваших требованиях. Если вы не новичок в поиске по ключу, и вы добавляете элементы в порядке ключей, поэтому коллекции не нужно выполнять свою сортировку, вот и все.
В .NET 4.0 у вас будет общий SortedSet Of T , который идеально подойдет вам. Никаких компромиссов.
используйте отсортированный список, я думаю, это решит вашу проблему поскольку объект SortedList внутренне поддерживает два массива для хранения элементов списка; то есть один массив для ключей и другой массив для связанных значений. Каждый элемент представляет собой пару ключ / значение, к которой можно получить доступ как объект DictionaryEntry
SortedList sl = new SortedList ();
foreach (DictionaryEntry x in sl) {}
Использование KeyedCollection
Его базовой базой является список, но он обеспечивает поиск по словарю на основе ключа. В этом случае ваш ключ - это строки. Если вы не добавляете один и тот же ключ дважды, все в порядке.
посмотреть отсортированный список http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx
Как предполагает Хакселит, вы можете извлечь из KeyedCollection
. На самом деле, она использует Список внизу до тех пор, пока вы не достигнете определенного порогового значения, а затем она поддерживает и Список, и Словарь. Если вы можете использовать функцию для получения одного из ваших ключей из одного из ваших значений, то это простое решение. Если нет, то все становится довольно запутанным.