2010-06-23 4 views
3

J'ai une table de hachage qui mappe les chaînes aux entiers. Les chaînes sont uniques, mais plusieurs peuvent être mappées sur le même nombre entier. Mon approche naïve consistait simplement à inverser le Hashtable en une SortedList qui est indexée par les valeurs de Hashtable, mais le problème est que vous obtenez un conflit dès que deux des chaînes de Hashtable mappent à la même valeur.Tri de la table de hachage par des valeurs (éventuellement non uniques)

Quel est le moyen le plus efficace de lister l'intégralité de ma table de hachage (clés et valeurs) ordonnée par les valeurs? (Lorsque deux valeurs sont les mêmes, je ne me soucie pas de leur commande.)

Répondre

0

Peut-être que cela pourrait fonctionner:

myhashtable.Keys.Select(k => new List<string, int>() {k, myhashtable[k]}) 
    .OrderBy(item => item[1]); 

Cela devrait vous donner une liste de listes, les listes imbriquées contenant exactement deux éléments, la clé et la valeur. Trié par la valeur (deuxième élément).

Je ne suis pas tout à fait sûr si le Hashtable a un type KeyValuePair<K, V> ... quelque chose comme ça pourrait aussi fonctionner:

myhashtable.Items.OrderBy(kvp => kvp.Value); 
0

La façon immédiate qui vient à esprit est dans le sens de ce que vous avez sauf que vous avez une SortedList (ou similaire) qui utilise les valeurs d'origine (ie les entiers) comme des clés et comme des valeurs a une liste des clés originales (ie les chaînes si je comprends bien) . Il y a un peu plus de difficulté à ajouter des valeurs (puisque vous devez vérifier si elles existent et les ajouter à la liste si c'est le cas ou créer une nouvelle liste sinon). Il peut y avoir de meilleures méthodes mais c'est celle qui vient immédiatement à l'esprit ...

0

Vous avez dit que vous vouliez la méthode la plus efficace. Le code suivant est le meilleur que j'ai pu trouver. J'ai expérimenté différentes approches en utilisant Linq, mais la méthode ci-dessus était environ 25-50% plus rapide.

Questions connexes