Wie sortiert man ein Wörterbuch nach Wert?

Ich muss oft ein Wörterbuch, das aus Schlüsseln & Werten besteht, nach Wert sortieren. Ich habe zum Beispiel einen Hash von Wörtern und deren Häufigkeit, den ich nach Häufigkeit sortieren möchte.

Es gibt eine "SortedList", die für einen einzelnen Wert (z.B. Häufigkeit) gut ist, den ich auf das Wort zurückführen möchte.

SortedDictionary ordnet nach Schlüssel, nicht nach Wert. Einige greifen auf eine [benutzerdefinierte Klasse] (http://www.codeproject.com/KB/recipes/lookupcollection.aspx) zurück, aber gibt es einen saubereren Weg?

Lösung

Verwendung:

using System.Linq.Enumerable;
...
List myList = aDictionary.ToList();

myList.Sort(
    delegate(KeyValuePair pair1,
    KeyValuePair pair2)
    {
        return pair1.Value.CompareTo(pair2.Value);
    }
);

Da Sie auf .NET 2.0 oder höher abzielen, können Sie dies in Lambda-Syntax vereinfachen - sie ist äquivalent, aber kürzer. Wenn Sie auf .NET 2.0 abzielen, können Sie diese Syntax nur verwenden, wenn Sie den Compiler von Visual Studio 2008 (oder höher) verwenden.

var myList = aDictionary.ToList();

myList.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value));
Kommentare (11)

Wenn wir uns umsehen und einige C# 3.0-Funktionen verwenden, können wir dies tun:

foreach (KeyValuePair item in keywordCounts.OrderBy(key=> key.Value))
{ 
    // do something with item.Key and item.Value
}

Dies ist der sauberste Weg, den ich gesehen habe, und ist ähnlich wie die Ruby-Weise der Handhabung von Hashes.

Kommentare (5)

Auf einer hohen Ebene haben Sie keine andere Wahl, als durch das gesamte Wörterbuch zu gehen und jeden Wert zu betrachten.

Vielleicht hilft dies: http://bytes.com/forum/thread563638.html Kopieren/Einfügen von John Timney:

Dictionary s = new Dictionary();
s.Add("1", "a Element");
s.Add("2", "c Element");
s.Add("3", "b Element");

List myList = new List(s);
myList.Sort(
    delegate(KeyValuePair firstPair,
    KeyValuePair nextPair)
    {
        return firstPair.Value.CompareTo(nextPair.Value);
    }
);
Kommentare (2)