Ви не сортуєте записи в словнику. Клас словників у .NET реалізований як хештебль - ця структура даних не може бути сортована за визначенням.
Якщо вам потрібно мати можливість переглядати колекцію (за клавішею) - вам потрібно використовувати SortedDictionary, який реалізований як двійкове дерево пошуку.
У вашому випадку, проте джерельна структура не має значення, оскільки вона сортується за іншим полем. Вам все одно потрібно буде сортувати його за частотою і помістити в нову колекцію, відсортовану за відповідним полем (частотою). Тож у цій колекції частоти - це клавіші, а слова - значення. Оскільки багато слів можуть мати однакову частоту (і ви будете використовувати його як ключ), ви не можете використовувати ні Словник, ні SortedDictionary (для них потрібні унікальні ключі). Це залишає вас з сортованим списком.
Я не розумію, чому ви наполягаєте на підтримці посилання на початковий елемент у головному / першому словнику.
Якщо об’єкти у вашій колекції мали складнішу структуру (більше полів), і вам потрібно було мати можливість ефективно отримувати доступ / сортувати їх за допомогою декількох різних полів як ключів - Вам, ймовірно, потрібна спеціальна структура даних, яка буде складатися з основного сховища, яке підтримує введення та видалення O (1) (LinkedList) та декілька структур індексації - Словники / Сортовані словники / Сортировані списки. Ці індекси будуть використовувати одне з полів вашого складного класу як ключ і вказівник / посилання на LinkedListNode в LinkedList як значення.
Вам потрібно координувати вставки та видалення, щоб ваші індекси синхронізувалися з основною колекцією (LinkedList), а видалення було б досить дорого, я думаю. Це схоже на те, як працюють індекси баз даних - вони фантастичні для пошуку, але вони стають тягарем, коли потрібно виконати багато оскаржень та видалень.
Все вищевикладене виправдане лише в тому випадку, якщо ви збираєтеся зробити обробку важкої обробки. Якщо вам потрібно вивести їх лише один раз, відсортовані за частотою, ви можете просто створити список (анонімних) кортежів:
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
трюк, який виконує трюк (правда, він приймає ключ для порівняння, але за допомогою ключа ви можете отримати значення). ;-)