Comment traverser les clés d'un Hashtable dans l'ordre alphabétique?
Question
Quelle est la façon de parcourir les clés d'un Hashtable plus facile par ordre alphabétique croissant?
La solution
Cela dépend assez de ce que le type de la clé est. Mais laisse supposer une minute qu'ils sont des chaînes. Vous pouvez utiliser la requête suivante LINQ
Hashtable table = GetHashTable();
var keys = table.Keys.Cast<String>().OrderBy(x => x);
Pour les structures plus complexes de la requête LINQ est légèrement différente. Supposons aussi que vous aviez la définition suivante pour une touche
struct Name {
public string First;
public string Last;
// Equality code omitted
}
Le code LINQ serait le suivant
Hashtable table = GetHashtable();
var keys = table.Keys.Cast<Name>().OrderBy(x => x.First).ThenBy(x => x.Last);
Autres conseils
Eh bien, je trouve cet extrait pour être le mieux adapté à ma situation:
Hashtable settings = GetSettings(); ArrayList keys = new ArrayList(); keys.AddRange(settings.Keys); keys.Sort(); foreach (object key in keys) { // Logic here }
Si vous voulez une carte qui conserve ses clés dans l'ordre naturel, je vous suggère de ne pas utiliser pour commencer Hashtable
. Si vous utilisez encore 1.1, en utilisant System.Collections.SortedList
. Si vous utilisez 2.0 ou supérieur, utilisez ou SortedList<TKey, TValue>
SortedDictionary<TKey, TValue>
. Les deux derniers sont en grande partie même en termes d'API, mais ont des caractéristiques de performance - voir la documentation pour plus d'informations
Cest pas vraiment ce que les tables de hachage sont conçus pour (ils sont faits pour avoir une répartition uniforme des clés). Utilisez un arbre triés?
Ce sera probablement un peu plus rapide à utiliser SortedList -
SortedList settings = new SortedList(GetSettings());
foreach (object key in settings.Keys)
{
//logic
}
créer et trier la liste de tableaux est O (n) + O (nlog n) = O (nlog n), alors que le constructeur SortedList (en accord avec la documentation) est O (n), alors il sera plus rapide à utiliser SortedList directement plutôt que d'utiliser un arraylist et explicitement le tri