2009-05-12 1 views

ответ

12

Это зависит от типа ключа. Но давайте предположим на минуту, что это строки. Вы можете использовать следующий запрос LINQ

Hashtable table = GetHashTable(); 
var keys = table.Keys.Cast<String>().OrderBy(x => x); 

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

struct Name { 
    public string First; 
    public string Last; 
    // Equality code omitted 
} 

код LINQ будет следующим

Hashtable table = GetHashtable(); 
var keys = table.Keys.Cast<Name>().OrderBy(x => x.First).ThenBy(x => x.Last); 
+0

«Не удается разрешить символ Cast» :( –

+0

@SeasonedCoder: вам нужно включить System.Linq. См. Http://msdn.microsoft.com/en-us/library/bb341406.aspx –

1

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

+0

Мне нужно работать с устаревшим кодом. На данный момент я совершенно неохотно реорганизую его, чтобы использовать что-то вроде SortedDictionary и т. Д. Но все же мне нужно пересечь ключи (строки) в алфавитном порядке. –

2

Если вы хотите, чтобы карта, которая хранит свои ключи в натуральном порядке, я предлагаю вам не использовать Hashtable для начала. Если вы все еще используете 1.1, используя System.Collections.SortedList. Если вы используете 2.0 или выше, используйте SortedList<TKey, TValue> или SortedDictionary<TKey, TValue>. Последние два являются в значительной степени одинаковыми с точки зрения API, но имеют разные характеристики производительности - см. Документы для получения дополнительной информации.

+0

Мне нравится идея SortedDictionary. Есть ли простой способ бросить между Hashtable и SortedDictionary ? –

+0

Нет - это разные типы. Вы можете создать новый SortedDictionary из Hashtable с некоторой осторожностью. Но если вы все равно используете .NET 2.0, почему вы используете Hashtable в первую очередь? В большинстве случаев вы должны просто заменить Hashtable на SortedDictionary, если вам не нужен поиск O (1). –

7

Ну, я нашел этот фрагмент кода, чтобы быть наиболее подходящим для моей ситуации:

 
Hashtable settings = GetSettings(); 
ArrayList keys = new ArrayList(); 
keys.AddRange(settings.Keys); 
keys.Sort(); 
foreach (object key in keys) 
{ 
    // Logic here 
}

1

Это, вероятно, будет немного быстрее использовать SortedList -

SortedList settings = new SortedList(GetSettings()); 
foreach (object key in settings.Keys) 
{ 
    //logic 
} 

создания & сортировки ArrayList - это O (n) + O (nlog n) = O (nlog n), тогда как конструктор SortedList (в соответствии с документами) равен O (n), поэтому быстрее использовать SortedList, а не использовать arraylist и явно сортировка

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