Pogosto moram razvrstiti slovar, sestavljen iz ključev & vrednosti, po vrednosti. Imam na primer hash besed in njihovih frekvenc, ki jih želim razvrstiti po frekvenci.
Obstaja SortedList
, ki je dober za eno vrednost (recimo frekvenco), ki jo želim preslikati nazaj na besedo.
SortedDictionary ureja po ključu in ne po vrednosti. Nekateri se zatekajo k custom class, vendar ali obstaja čistejši način?
Uporaba:
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);
}
);
Ker uporabljate .NET 2.0 ali višje, lahko to poenostavite v sintakso lambda - je enakovredna, vendar krajša. Če uporabljate .NET 2.0, lahko to sintakso uporabljate le, če uporabljate prevajalnik iz programa Visual Studio 2008 (ali novejšega).
var myList = aDictionary.ToList();
myList.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value));
Če se ozremo naokoli in uporabimo nekatere funkcije C# 3.0, lahko to storimo:
foreach (KeyValuePair<string,int> item in keywordCounts.OrderBy(key=> key.Value))
{
// do something with item.Key and item.Value
}
To je najčistejši način, kar sem jih videl, in je podoben načinu ravnanja s heši v jeziku Ruby.
Na visoki ravni nimate druge izbire, kot da se sprehodite skozi celoten slovar in si ogledate vsako vrednost.
Morda vam bo pomagalo tole: http://bytes.com/forum/thread563638.html Kopiranje/prilagajanje od Johna Timneyja:
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);
}
);