Non ordinare le voci nel dizionario. La classe del dizionario in .NET è implementata come hashtable - questa struttura di dati non è ordinabile per definizione.
Se devi essere in grado di scorrere la tua raccolta (per chiave), devi utilizzare SortedDictionary, che viene implementato come albero di ricerca binario.
Nel tuo caso, tuttavia, la struttura di origine è irrilevante, poiché è ordinata per un campo diverso. Dovresti comunque ordinarlo per frequenza e inserirlo in una nuova raccolta ordinata per il campo pertinente (frequenza). Quindi in questa raccolta le frequenze sono chiavi e le parole sono valori. Poiché molte parole possono avere la stessa frequenza (e la userete come chiave) non è possibile utilizzare né Dictionary né SortedDictionary (richiedono chiavi univoche). Questo ti lascia con un SortedList.
Non capisco perché insisti a mantenere un collegamento all'elemento originale nel tuo dizionario principale / primo.
Se gli oggetti nella tua raccolta avessero una struttura più complessa (più campi) e tu dovessi essere in grado di accedervi / ordinarli in modo efficiente usando diversi campi come chiavi - Probabilmente avresti bisogno di una struttura di dati personalizzata che consisterebbe nella memoria principale che supporta l'inserimento e la rimozione di O (1) (LinkedList) e diverse strutture di indicizzazione - Dictionaries / SortedDictionaries / SortedLists. Questi indici utilizzerebbero uno dei campi della tua classe complessa come chiave e un puntatore / riferimento a LinkedListNode in LinkedList come valore.
Dovresti coordinare inserimenti e rimozioni per mantenere i tuoi indici sincronizzati con la raccolta principale (LinkedList) e le rimozioni sarebbero piuttosto costose, penso. Questo è simile al modo in cui funzionano gli indici del database: sono fantastici per le ricerche ma diventano un peso quando è necessario eseguire molte eliminazioni ed eliminazioni.
Tutto quanto sopra è giustificato solo se hai intenzione di eseguire qualche elaborazione pesante di ricerca. Se hai bisogno di emetterli solo una volta ordinati per frequenza, potresti semplicemente produrre un elenco di tuple (anonime):
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
trucco (vero che accetta una chiave da confrontare, ma con una chiave puoi ottenere un valore). ;-)