Muitas vezes tenho que ordenar um dicionário, composto por chaves & valores, por valor. Por exemplo, eu tenho um hash de palavras e respectivas frequências, que eu quero ordenar por frequência.
Existe uma SortedList
que é boa para um único valor (digamos frequência), que eu quero mapear de volta para a palavra.
SortedDictionary ordena por chave, não por valor. Alguns recorrem a uma classe personalizada, mas existe uma forma mais limpa?
Use:
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);
}
);
Como você tem como alvo .NET 2.0 ou superior, você pode simplificar isso em sintaxe lambda -- é equivalente, mas mais curto. Se você tiver como alvo .NET 2.0, você só pode usar essa sintaxe se estiver usando o compilador do Visual Studio 2008 (ou acima).
var myList = aDictionary.ToList();
myList.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value));
Olhando ao redor, e usando algumas funcionalidades do C# 3.0 podemos fazer isso:
foreach (KeyValuePair<string,int> item in keywordCounts.OrderBy(key=> key.Value))
{
// do something with item.Key and item.Value
}
Esta é a maneira mais limpa que eu já vi e é semelhante à maneira Ruby de lidar com hashes.
Em um nível alto, você não tem outra escolha a não ser caminhar por todo o Dicionário e olhar para cada valor.
Talvez isto ajude: http://bytes.com/forum/thread563638.html Cópia/colagem de John Timney:
Dicionário<string, string> s = novo Dicionário<string, string>();
s.Add("1", "a Item");
s.Add("2", "c Item");
s.Add("3", "b Item");
Lista<KeyValuePair<string, string>> myList = nova Lista<KeyValuePair<string, string>>>(s);
myList.Sort(
delegate(KeyValuePair<string, string> firstPair,
KeyValuePair<string, string> nextPair)
{
retornar firstPair.Value.CompareTo(nextPair.Value);
}
);