Je dois souvent trier un dictionnaire, composé de clés & ; 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 ?
Utilisez :
using System.Linq.Enumerable;
...
List<KeyValuePair<string, string>> myList = aDictionary.ToList();
myList.Sort(
delegate(KeyValuePair<string, string> pair1,
KeyValuePair<string, string> 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));
En regardant autour de nous, et en utilisant certaines fonctionnalités de C# 3.0, nous pouvons le faire :
foreach (KeyValuePair<string,int> 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.
À 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<string, string> s = new Dictionary<string, string>() ;
s.Add("1", "a Item") ;
s.Add("2", "c Item") ;
s.Add("3", "b Item") ;
List<KeyValuePair<string, string>> myList = new List<KeyValuePair<string, string>>(s) ;
myList.Sort(
delegate(KeyValuePair<string, string> firstPair,
KeyValuePair<string, string> nextPair)
{
return firstPair.Value.CompareTo(nextPair.Value) ;
}
) ;