Можно ли отсортировать HashTable?
У меня есть свойство, которое возвращает HashTable
. Я бы хотел отсортировать его без рефакторинга моей собственности. Обратите внимание: я не хочу возвращать другой тип.
Код:
/// <summary>
/// All content containers.
/// </summary>
public Hashtable Containers
{
get
{
Hashtable tbl = new Hashtable();
foreach (Control ctrl in Form.Controls)
{
if (ctrl is PlaceHolder)
{
tbl.Add(ctrl.ID, ctrl);
}
// Also check for user controls with content placeholders.
else if (ctrl is UserControl)
{
foreach (Control ctrl2 in ctrl.Controls)
{
if (ctrl2 is PlaceHolder)
{
tbl.Add(ctrl2.ID, ctrl2);
}
}
}
}
return tbl;
}
}
Ответы
Ответ 1
Другой вариант - построить хеш-таблицу, как вы уже делали, а затем просто построить сортированный набор из ключей. Вы можете выполнять итерацию через этот сортированный набор ключей, получая соответствующее значение из хэш-таблицы по мере необходимости.
Ответ 2
Hashtables работают, сопоставляя ключи со значениями. Неявным в этом сопоставлении является концепция, что ключи не сортируются или не сохраняются в каком-либо конкретном порядке.
Однако вы можете взглянуть на SortedDictionary<K,V>
.
Ответ 3
lubos прав: вы не можете сортировать HashTable. Если бы вы могли, это не было бы HashTable. Вы можете перечислить HashTable, а затем отсортировать перечисление. Но это было бы очень медленно. Гораздо лучше использовать SortedDictionary
вместо этого.
Ответ 4
Извините, но вы не можете сортировать хеш-таблицу. Вам придется реорганизовать свой код, чтобы использовать некоторые сортируемые коллекции.
Ответ 5
Я уверен, что хеш-таблицы не могут быть отсортированы...;)
Таблица хеширования Википедии
Ответ 6
Вам нужно будет вернуть что-то другое, кроме хеш-таблицы. Я не буду повторять, что вы утверждаете, чтобы понять уже, но вам нужно переосмыслить любую часть вашего дизайна, чтобы вы возвращали отсортированные объекты в хеш-таблице.
Ответ 7
Не совсем ответ С#, но я уверен, что вы можете что-то сделать.
В Perl обычно используется "сортировка" хеш-таблицы для использования в выводе на дисплей.
Например:
print "Items: ";
foreach (sort keys %items) {
print $_, '=', $items{$_}, ' ';
}
Трюк здесь в том, что Perl не сортирует хэш, он сортирует скопированный список хеш-ключей. В С# должно быть достаточно легко извлечь хеш-ключи в список, а затем отсортировать список.
Ответ 8
Нет смысла сортировать хэш-таблицу, потому что у вас уже есть почти постоянное время поиска. Или в худшем случае O (B), где B - размер ковша.
Ответ 9
Конечно, хэш-таблицы могут быть отсортированы, но вам нужно сначала определить, что значит сортировать хеш-таблицу. (В этом и заключается проблема)
Однако, как только вы это сделали, вы неизменно исключили все преимущества, которые может дать хэш-таблица, и вы можете использовать отсортированный массив (с бинарным поиском) или вместо него использовать красно-черное дерево.
Ответ 10
Я новый программист, поэтому все, что я говорю, с солью. Но вот что я сделал, когда столкнулся с подобной ситуацией. Я создал класс, который имел две переменные, а затем создал объект List
от этих переменных, а затем я использовал linq для сортировки этих переменных.
Ответ 11
Вы также можете использовать DataView для сортировки Hashtable. Вот статья, которую я написал 5 лет назад: http://www.codeproject.com/Articles/37039/Sorting-Hashtable