it-swarm.com.ru

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

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

8
joel.neely

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

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

18
John Feminella

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

6
Joel Coehoorn

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

3
lubos hasko

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

Хеш-таблица Википедии

2
Daniel Brückner

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

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

Например:

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

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

1
Zan Lynx

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

1
Peter

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

0
Igor Krupitsky

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

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

0
Arafangion

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

0
Brian R. Bondy

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

0
Noah