Можно ли сортировать хэш-таблицу?

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