Ik moet vaak een woordenboek, bestaande uit sleutels & waarden, sorteren op waarde. Bijvoorbeeld, ik heb een hash van woorden en respectievelijke frequenties, die ik wil rangschikken op frequentie.
Er is een SortedList
die goed is voor een enkele waarde (zeg frequentie), die ik terug wil koppelen naar het woord.
SortedDictionary ordent op sleutel, niet op waarde. Sommigen nemen hun toevlucht tot een custom class, maar is er een schonere manier?
Gebruik:
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);
}
);
Aangezien je je richt op .NET 2.0 of hoger, kun je dit vereenvoudigen tot lambda syntaxis -- het'is gelijkwaardig, maar korter. Als je je richt op .NET 2.0 kun je deze syntaxis alleen gebruiken als je de compiler van Visual Studio 2008 (of hoger) gebruikt.
var myList = aDictionary.ToList();
myList.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value));
Als we rondkijken, en enkele C# 3.0 functies gebruiken, kunnen we dit doen:
foreach (KeyValuePair<string,int> item in keywordCounts.OrderBy(key=> key.Value))
{
// do something with item.Key and item.Value
}
Dit is de schoonste manier die ik heb gezien en is vergelijkbaar met de Ruby manier om met hashes om te gaan.
Op een hoog niveau, heb je geen andere keuze dan het hele woordenboek door te lopen en elke waarde te bekijken.
Misschien helpt dit: http://bytes.com/forum/thread563638.html Kopiëren/Plakken van 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);
mijnLijst.Sorteren(
delegate(KeyValuePair<string, string> firstPair,
KeyValuePair<string, string> nextPair)
{
return firstPair.Value.CompareTo(nextPair.Value);
}
);