Nu sortați înscrierile în dicționar. Dicționarul de clasă în .NET este implementat ca un hashtable - această structură de date nu este definită prin definiție.
Dacă trebuie să puteți relua colecția dvs. (cu cheie) - trebuie să utilizați SortedDictionary, care este implementat ca arbore de căutare binară.
În cazul tău, structura sursă este irelevantă, deoarece este sortată de un alt câmp. Încă mai trebuie să o sortați după frecvență și să o puneți într-o nouă colecție sortată după câmpul relevant (frecvență). Deci, în această colecție frecvențele sunt chei, iar cuvintele sunt valori. Deoarece multe cuvinte pot avea aceeași frecvență (și o veți folosi ca o cheie), nu puteți utiliza nici dicționarul, nici SortedDictionary (acestea necesită chei unice). Acest lucru vă va lăsa cu un SortedList.
Nu înțeleg de ce insistă să mențineți o legătură cu elementul original din dicționarul dvs. principal / primul.
Dacă obiectele din colecția dvs. aveau o structură mai complexă (mai multe câmpuri) și aveați nevoie să le puteți accesa / sorta eficient utilizând mai multe câmpuri ca chei - Probabil că veți avea nevoie de o structură personalizată de date care să compune din spațiul de stocare principal sprijină inserarea și eliminarea O (1) (LinkedList) și mai multe structuri de indexare - Dicționare / SortedDictionaries / SortedLists. Acești indici ar folosi unul din câmpurile din clasa complexă ca cheie și un pointer / referință la LinkedListNode din LinkedList ca valoare.
Va trebui să coordonați inserțiile și eliminările pentru a vă menține indexurile în sincronizare cu colecția principală (LinkedList), iar eliminările ar fi destul de costisitoare.
Acest lucru este similar cu modul în care funcționează indexurile bazei de date - sunt fantastice pentru căutări, dar devin o povară atunci când trebuie să efectuați multe insecte și ștergeri.
Toate cele de mai sus sunt justificate doar dacă intenționați să faceți unele prelucrări grele. Dacă aveți nevoie doar să le trimiteți după o sortare după frecvență, atunci puteți să produceți o listă de piese (anonime):
var dict = new SortedDictionary();
// 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);
}