Bạn không sắp xếp các mục trong Từ điển. Lớp từ điển trong .NET được triển khai dưới dạng hashtable - cấu trúc dữ liệu này không thể sắp xếp theo định nghĩa.
Nếu bạn cần có khả năng lặp lại bộ sưu tập của mình (bằng phím) - bạn cần sử dụng SortedDipedia, được triển khai như một Cây tìm kiếm nhị phân.
Tuy nhiên, trong trường hợp của bạn, cấu trúc nguồn không liên quan, bởi vì nó được sắp xếp theo một trường khác. Bạn vẫn sẽ cần sắp xếp nó theo tần số và đưa nó vào một bộ sưu tập mới được sắp xếp theo trường (tần số) có liên quan. Vì vậy, trong bộ sưu tập này, tần số là khóa và từ là giá trị. Vì nhiều từ có thể có cùng tần số (và bạn sẽ sử dụng nó làm khóa), bạn không thể sử dụng cả Từ điển cũng như SortedDipedia (chúng yêu cầu các khóa duy nhất). Điều này để lại cho bạn một SortedList.
Tôi không hiểu lý do tại sao bạn khăng khăng duy trì một liên kết đến mục gốc trong từ điển chính / đầu tiên của bạn.
Nếu các đối tượng trong bộ sưu tập của bạn có cấu trúc phức tạp hơn (nhiều trường hơn) và bạn cần có khả năng truy cập / sắp xếp chúng một cách hiệu quả bằng cách sử dụng một số trường khác nhau làm khóa - Bạn có thể sẽ cần một cấu trúc dữ liệu tùy chỉnh bao gồm bộ lưu trữ chính hỗ trợ chèn và loại bỏ O (1) (LinkedList) và một số cấu trúc lập chỉ mục - Từ điển / Sắp xếp từ điển / Sắp xếp theo thứ tự. Các chỉ mục này sẽ sử dụng một trong các trường từ lớp phức tạp của bạn làm khóa và con trỏ / tham chiếu đến LinkedListNode trong LinkedList làm giá trị.
Bạn sẽ cần phối hợp các phần chèn và xóa để giữ cho các chỉ mục của bạn được đồng bộ hóa với bộ sưu tập chính (LinkedList) và các phần xóa sẽ khá tốn kém. Điều này tương tự như cách các chỉ mục cơ sở dữ liệu hoạt động - chúng rất tuyệt vời cho việc tra cứu nhưng chúng trở thành gánh nặng khi bạn cần thực hiện nhiều thao tác chèn và xóa.
Tất cả những điều trên chỉ hợp lý nếu bạn định thực hiện một số xử lý nặng. Nếu bạn chỉ cần xuất chúng một khi được sắp xếp theo tần suất thì bạn có thể chỉ cần tạo một danh sách các bộ dữ liệu (ẩn danh):
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
mẹo thực hiện (đúng là nó chấp nhận một khóa để so sánh, nhưng với một khóa, bạn có thể nhận được một giá trị). ;-)