Можно ли отсортировать HashTable? - PullRequest
14 голосов
/ 24 марта 2009

У меня есть свойство, которое возвращает 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 ]

18 голосов
/ 24 марта 2009

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

Однако вы можете взглянуть на SortedDictionary<K,V>.

8 голосов
/ 24 марта 2009

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

6 голосов
/ 24 марта 2009

Любос прав: вы не можете отсортировать HashTable. Если бы вы могли, это не было бы HashTable. Вы можете перечислить HashTable, а затем отсортировать перечисление. Но это было бы очень медленно. Гораздо лучше вместо этого использовать SortedDictionary.

3 голосов
/ 24 марта 2009

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

2 голосов
/ 24 марта 2009

Я совершенно уверен, что хеш-таблицы не могут быть отсортированы ...;)

Хэш-таблица Wikipedia

1 голос
/ 24 марта 2009

Не совсем C # ответ, но я уверен, что вы можете что-то из этого сделать.

В Perl принято "сортировать" хеш-таблицу для использования при выводе на дисплей.

Например:

print "Items: ";
foreach (sort keys %items) {
    print $_, '=', $items{$_}, ' ';
}

Хитрость в том, что Perl не сортирует хэш, а сортирует скопированный список ключей хеша. В C # должно быть достаточно просто извлечь хеш-ключи в список, а затем отсортировать этот список.

1 голос
/ 24 марта 2009

Вам нужно будет вернуть что-то кроме хеш-таблицы. Я не буду повторять то, что, как вы утверждаете, уже поняли, но вам нужно переосмыслить ту часть вашего проекта, которая требует от вас вернуть отсортированные объекты в хеш-таблицу.

0 голосов
/ 08 августа 2014

Вы также можете использовать DataView для сортировки Hashtable. Вот статья, которую я написал 5 лет назад: http://www.codeproject.com/Articles/37039/Sorting-Hashtable

0 голосов
/ 03 августа 2012

Я новый программист, так что принимайте все, что я говорю, с долей соли. Но вот что я сделал, когда столкнулся с подобной ситуацией. Я создал класс с двумя переменными, а затем создал объект List из этих переменных, а затем использовал linq для сортировки этих переменных.

0 голосов
/ 24 марта 2009

Конечно, хеш-таблицы можно сортировать, но сначала нужно определить, что означает сортировка хеш-таблицы. (В этом и заключается проблема)

Однако, сделав это, вы неизменно удалили все преимущества, которые может дать вам хеш-таблица, и вы также можете использовать отсортированный массив (с двоичным поиском) или использовать красно-черное дерево.

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