2009-03-24 2 views
14

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

+1 Из-за нижнего уровня! Это совершенно правильный вопрос от кого-то, кто не понимает, что такое HashTable! –

+0

+1 из-за понижения. Вопрос показывает, что плакат не знает, как работают HashTables, но является вполне актуальной темой. – snemarch

+1

@agassan: Я немного очистил ваш пост, чтобы он был более сплоченным и удалил вопрос LINQ, поскольку это, похоже, не то, что вы действительно спрашивали. Не стесняйтесь откат, если вам это не нравится. –

ответ

8

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

+0

Это именно то, как я смог заставить его работать. – user81740

3

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

2

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

Wikipedia Hash Table

6

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

0

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

18

Hashtables работает, сопоставляя ключи со значениями. Неявным в этом сопоставлении является концепция, что ключи не сортируются или не сохраняются в каком-либо конкретном порядке.

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

+0

Спасибо. Прекрасно работает. Мне было очень легко реагировать на свойства реактора, так как большинство моих выпадающих элементов с использованием Key Pair Value – user81740

1

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

0

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

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

1

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

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

Например:

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

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

+0

Я сделал это, создав объект SortList, затем перебираю значения хэш-таблицы и помещал значения в SortList, а затем sortList.Sort() – user81740

0

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

Смежные вопросы