Можно ли сортировать хэш-таблицу?
у меня есть свойство, которое возвращает 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;
}
}
11 ответов
другой вариант-построить хэш-таблицу, как вы уже делаете, а потом просто построить упорядоченный набор из ключей. Вы можете перебирать этот отсортированный набор ключей, извлекая соответствующее значение из хэш-таблицы по мере необходимости.
работы хеш-таблицы с помощью ключей, привязанных к значениям. Неявным в этом сопоставлении является концепция, что ключи не сортируются или хранятся в каком-либо определенном порядке.
тем не менее, вы можете взглянуть на SortedDictionary<K,V>
.
Любош правильно:не могу сортировка хэш-таблицы. Если бы вы могли, это не хеш. Можно перечислить хэш-таблицу, а затем отсортировать перечисление. Но это будет очень медленно. Гораздо лучше использовать SortedDictionary
вместо.
Извините, но вы не можете сортировать hashtable. Вам придется рефакторить ваш код для использования некоторых коллекций сортировки.
вам нужно будет вернуть что-то другое, кроме хэш-таблицы. Я не буду повторять то, что вы уже поняли, но вам нужно переосмыслить любую часть вашего дизайна, требующую возврата отсортированных объектов в хэш-таблицу.
не совсем ответ на C#, но я уверен, что вы можете сделать что-то из этого.
в Perl принято "сортировать" хэш-таблицу для использования в выводе на дисплей.
например:
print "Items: ";
foreach (sort keys %items) {
print $_, '=', $items{$_}, ' ';
}
трюк здесь в том, что Perl не сортирует хэш, он сортирует скопированный список хэш-ключей. В C# должно быть достаточно легко извлечь хэш-ключи в список, а затем отсортировать этот список.
нет смысла сортировать хэш-таблицу, потому что у вас уже есть почти постоянное время поиска. Или в худшем случае O (B), где B-размер ведра.
конечно, хэш-таблицы могут быть отсортированы, но вам нужно сначала определить, что значит сортировать хэш-таблицу. (Вот в чем вопрос)
Как только вы это сделаете, вы неизменно удаляете все преимущества, которые может дать вам хэш-таблица, и вы можете также использовать отсортированный массив (с двоичным поиском) или использовать вместо этого красно-черное дерево.
Я новый программист, поэтому принимайте все, что я говорю, с солью. Но вот что я сделал, когда столкнулся с подобной ситуацией. Я создал класс, который имел две переменные, а затем создал List
объект от этих переменных, а затем я использовал linq для сортировки этих переменных.
вы также можете использовать DataView для сортировки хэш-таблицы. Вот статья, которую я написал 5 лет назад:http://www.codeproject.com/Articles/37039/Sorting-Hashtable