Spesso devo ordinare un dizionario, composto da chiavi & valori, per valore. Per esempio, ho un hash di parole e rispettive frequenze, che voglio ordinare per frequenza.
C'è una SortedList
che va bene per un singolo valore (diciamo la frequenza), che voglio rimappare alla parola.
SortedDictionary ordina per chiave, non per valore. Alcuni ricorrono a una classe personalizzata, ma c'è un modo più pulito?
Utilizzare:
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);
}
);
Dal momento che stai puntando a .NET 2.0 o superiore, puoi semplificare questo in sintassi lambda - è equivalente, ma più breve. Se stai puntando a .NET 2.0 puoi usare questa sintassi solo se stai usando il compilatore di Visual Studio 2008 (o superiore).
var myList = aDictionary.ToList();
myList.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value));
Guardando in giro, e usando alcune caratteristiche di C# 3.0 possiamo farlo:
foreach (KeyValuePair<string,int> item in keywordCounts.OrderBy(key=> key.Value))
{
// do something with item.Key and item.Value
}
Questo è il modo più pulito che ho visto ed è simile al modo in cui Ruby gestisce gli hash.
Ad alto livello, non avete altra scelta che percorrere l'intero Dizionario e guardare ogni valore.
Forse questo aiuta: http://bytes.com/forum/thread563638.html Copia/incolla da 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(
delegato(KeyValuePair<string, string> firstPair,
KeyValuePair<string, string> nextPair)
{
return firstPair.Value.CompareTo(nextPair.Value);
}
);