Nie sortujesz wpisów w Słowniku. Klasa słownika w .NET jest implementowana jako tablica mieszająca - tej struktury danych nie można z definicji sortować.
Jeśli chcesz mieć możliwość iteracji w swojej kolekcji (według klucza) - musisz użyć SortedDictionary, który jest zaimplementowany jako drzewo wyszukiwania binarnego.
W twoim przypadku jednak struktura źródłowa nie ma znaczenia, ponieważ jest posortowana według innego pola. Nadal będziesz musiał posortować dane według częstotliwości i umieścić je w nowej kolekcji posortowanej według odpowiedniego pola (częstotliwości). W tej kolekcji częstotliwości to klucze, a słowa to wartości. Ponieważ wiele słów może mieć tę samą częstotliwość (i użyjesz go jako klucza), nie możesz używać ani słownika, ani SortedDictionary (wymagają one unikatowych kluczy). To pozostawia Ci SortedList.
Nie rozumiem, dlaczego nalegasz na utrzymanie linku do oryginalnej pozycji w głównym / pierwszym słowniku.
Jeśli obiekty w Twojej kolekcji miały bardziej złożoną strukturę (więcej pól) i musiałeś mieć możliwość skutecznego dostępu / sortowania ich przy użyciu kilku różnych pól jako kluczy - prawdopodobnie potrzebowałbyś niestandardowej struktury danych, która składałaby się z głównej pamięci, która obsługuje wstawianie i usuwanie O (1) (LinkedList) oraz kilka struktur indeksujących - Dictionaries / SortedDictionaries / SortedLists. Indeksy te wykorzystałyby jedno z pól z twojej klasy złożonej jako klucz oraz wskaźnik / referencję do LinkedListNode w LinkedList jako wartość.
Trzeba koordynować wstawiania i usuwania, aby utrzymać synchronizację indeksów z kolekcją główną (LinkedList), a usuwanie byłoby dość drogie. Jest to podobne do działania indeksów baz danych - są fantastyczne do wyszukiwania, ale stają się obciążeniem, gdy trzeba wykonać wiele wstawień i usunięć.
Wszystko powyższe jest uzasadnione tylko wtedy, gdy zamierzasz przeprowadzić ciężkie przetwarzanie. Jeśli potrzebujesz je wyprowadzić tylko raz posortowane według częstotliwości, możesz po prostu utworzyć listę (anonimowych) krotek:
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
, który załatwi sprawę (prawda, że akceptuje klucz do porównania, ale za pomocą klucza można uzyskać wartość). ;-)