2009-05-12 4 views

Répondre

12

Cela dépend assez du type de clé. Mais supposons pour une minute qu'ils sont des ficelles. Vous pouvez utiliser la requête LINQ suivante

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

Pour les structures plus complexes, la requête LINQ est légèrement différente. Supposons aussi que vous aviez la définition suivante pour une

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

Le code LINQ serait la suivante

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

"Impossible de résoudre le symbole Cast" :( –

+0

@SeasonedCoder: vous devez inclure System.Linq. Voir http://msdn.microsoft.com/en-us/library/bb341406.aspx –

1

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é?

+0

Je dois travailler avec du code hérité. Pour l'instant, je me sens plutôt réticent à le refactoriser pour utiliser quelque chose comme SortedDictionary, etc. Mais j'ai toujours besoin de parcourir les touches (qui sont des chaînes) dans l'ordre alphabétique. –

2

Si vous voulez une carte qui conserve ses clés dans l'ordre naturel, je vous suggère de ne pas utiliser Hashtable pour commencer. Si vous utilisez toujours la version 1.1, utilisez System.Collections.SortedList. Si vous utilisez une version 2.0 ou supérieure, utilisez SortedList<TKey, TValue> ou SortedDictionary<TKey, TValue>. Les deux derniers sont en grande partie les mêmes en termes d'API, mais ont des caractéristiques de performance différentes - voir les docs pour plus d'informations.

+0

J'aime l'idée de SortedDictionary. Existe-t-il un moyen facile de transtyper entre Hashtable et SortedDictionary ? –

+0

Non - ce sont des types distincts. Vous pouvez créer un nouveau SortedDictionary à partir d'une Hashtable, avec un peu de soin. Mais si vous utilisez .NET 2.0 de toute façon, pourquoi utilisez-vous Hashtable en premier lieu? Vous devriez être capable de simplement remplacer Hashtable par SortedDictionary dans la plupart des cas, sauf si vous avez vraiment besoin de la recherche O (1). –

7

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 
}

1

Ce sera probablement un peu plus rapide à utiliser SortedList -

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

créer & trier les ArrayList est O (n) + O (nlog n) = O (nlog n), alors que le constructeur SortedList (selon les docs) est O (n), donc il sera plus rapide d'utiliser SortedList directement plutôt que d'utiliser un arraylist et triant explicitement

Questions connexes