Comment trier un dictionnaire par valeur ?

Je dois souvent trier un dictionnaire, composé de clés &amp ; valeurs, par valeur. Par exemple, j'ai un hachage de mots et de leurs fréquences respectives, que je veux classer par fréquence.

Il y a une SortedList qui est bonne pour une seule valeur (disons la fréquence), que je veux remettre en correspondance avec le mot.

Le SortedDictionary ordonne par clé, pas par valeur. Certains ont recours à une [classe personnalisée] (http://www.codeproject.com/KB/recipes/lookupcollection.aspx), mais existe-t-il une méthode plus propre ?

Solution

Utilisez :

using System.Linq.Enumerable;
...
List myList = aDictionary.ToList();

myList.Sort(
    delegate(KeyValuePair pair1,
    KeyValuePair pair2)
    {
        return pair1.Value.CompareTo(pair2.Value);
    }
);

Si vous ciblez .NET 2.0 ou plus, vous pouvez simplifier cette syntaxe en utilisant la syntaxe lambda - c'est équivalent, mais plus court. Si vous ciblez .NET 2.0, vous ne pouvez utiliser cette syntaxe que si vous utilisez le compilateur de Visual Studio 2008 (ou supérieur).

var myList = aDictionary.ToList();

myList.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value));
Commentaires (11)

En regardant autour de nous, et en utilisant certaines fonctionnalités de C# 3.0, nous pouvons le faire :

foreach (KeyValuePair item in keywordCounts.OrderBy(key=> key.Value))
{ 
    // do something with item.Key and item.Value
}

C'est la méthode la plus propre que j'ai vue et elle est similaire à la façon dont Ruby gère les hachages.

Commentaires (5)

À un niveau élevé, vous n'avez pas d'autre choix que de parcourir l'ensemble du dictionnaire et d'examiner chaque valeur.

Ceci peut vous aider : http://bytes.com/forum/thread563638.html Copie/collage de John Timney :

Dictionary s = new Dictionary() ;
s.Add("1", "a Item") ;
s.Add("2", "c Item") ;
s.Add("3", "b Item") ;

List myList = new List(s) ;
myList.Sort(
    delegate(KeyValuePair firstPair,
    KeyValuePair nextPair)
    {
        return firstPair.Value.CompareTo(nextPair.Value) ;
    }
) ;
Commentaires (2)