Sie sortieren keine Einträge im Wörterbuch. Die Wörterbuchklasse in .NET ist als Hashtabelle implementiert - diese Datenstruktur kann per Definition nicht sortiert werden.
Wenn Sie in der Lage sein müssen, Ihre Sammlung (nach Schlüssel) zu durchlaufen, müssen Sie SortedDictionary verwenden, das als binärer Suchbaum implementiert ist.
In Ihrem Fall ist die Quellstruktur jedoch irrelevant, da sie nach einem anderen Feld sortiert ist. Sie müssten es weiterhin nach Häufigkeit sortieren und in eine neue Sammlung einfügen, die nach dem entsprechenden Feld (Häufigkeit) sortiert ist. In dieser Sammlung sind die Frequenzen Schlüssel und Wörter Werte. Da viele Wörter dieselbe Häufigkeit haben können (und Sie sie als Schlüssel verwenden werden), können Sie weder Dictionary noch SortedDictionary verwenden (sie erfordern eindeutige Schlüssel). Dadurch erhalten Sie eine SortedList.
Ich verstehe nicht, warum Sie darauf bestehen, einen Link zum Originalelement in Ihrem Haupt- / Erstwörterbuch beizubehalten.
Wenn die Objekte in Ihrer Sammlung eine komplexere Struktur hätten (mehr Felder) und Sie in der Lage sein müssten, mithilfe mehrerer verschiedener Felder als Schlüssel effizient auf sie zuzugreifen / sie zu sortieren, benötigen Sie wahrscheinlich eine benutzerdefinierte Datenstruktur, die aus dem Hauptspeicher besteht unterstützt das Einfügen und Entfernen von O (1) (LinkedList) und verschiedene Indexierungsstrukturen - Dictionaries / SortedDictionaries / SortedLists. Diese Indizes verwenden eines der Felder aus Ihrer komplexen Klasse als Schlüssel und einen Zeiger / Verweis auf den LinkedListNode in der LinkedList als Wert.
Sie müssten Einfügungen und Entfernungen koordinieren, um Ihre Indizes mit der Hauptsammlung (LinkedList) synchron zu halten, und Entfernungen wären meiner Meinung nach ziemlich teuer. Dies ähnelt der Funktionsweise von Datenbankindizes - sie eignen sich hervorragend für Suchvorgänge, werden jedoch zu einer Belastung, wenn Sie viele Einfügungen und Löschungen durchführen müssen.
All dies ist nur gerechtfertigt, wenn Sie eine nachschlagende Verarbeitung durchführen. Wenn Sie sie nur einmal nach Häufigkeit sortiert ausgeben müssen, können Sie einfach eine Liste von (anonymen) Tupeln erstellen:
var dict = new SortedDictionary<string, int>();
// ToDo: populate dict
var output = dict.OrderBy(e => e.Value).Select(e => new {frequency = e.Value, word = e.Key}).ToList();
foreach (var entry in output)
{
Console.WriteLine("frequency:{0}, word: {1}",entry.frequency,entry.word);
}
IComparer
, das den Trick ausführt (wahr, dass es einen zu vergleichenden Schlüssel akzeptiert, aber mit einem Schlüssel können Sie einen Wert erhalten). ;-)