Можно ли отсортировать 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

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

Ответ 6

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

Ответ 7

Не совсем ответ С#, но я уверен, что вы можете что-то сделать.

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

Например:

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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