Anda tidak mengurutkan entri dalam Kamus. Kelas kamus di .NET diimplementasikan sebagai hashtable - struktur data ini tidak dapat diurutkan berdasarkan definisi.
Jika Anda harus dapat mengulangi koleksi Anda (dengan kunci) - Anda perlu menggunakan SortedDictionary, yang diimplementasikan sebagai Binary Search Tree.
Dalam kasus Anda, namun struktur sumber tidak relevan, karena diurutkan berdasarkan bidang yang berbeda. Anda masih perlu mengurutkannya berdasarkan frekuensi dan memasukkannya ke dalam koleksi baru yang diurutkan berdasarkan bidang yang relevan (frekuensi). Jadi dalam koleksi ini frekuensinya adalah kunci dan kata-kata adalah nilai. Karena banyak kata dapat memiliki frekuensi yang sama (dan Anda akan menggunakannya sebagai kunci), Anda tidak dapat menggunakan Kamus maupun SortedDictionary (mereka memerlukan kunci unik). Ini meninggalkan Anda dengan SortedList.
Saya tidak mengerti mengapa Anda bersikeras mempertahankan tautan ke item asli di kamus utama / pertama Anda.
Jika objek dalam koleksi Anda memiliki struktur yang lebih kompleks (lebih banyak bidang) dan Anda harus dapat mengakses / mengurutkannya secara efisien menggunakan beberapa bidang berbeda sebagai kunci - Anda mungkin memerlukan struktur data khusus yang akan terdiri dari penyimpanan utama yang mendukung O (1) penyisipan dan penghapusan (LinkedList) dan beberapa struktur pengindeksan - Kamus / SortedDictionaries / SortedLists. Indeks ini akan menggunakan salah satu bidang dari kelas kompleks Anda sebagai kunci dan pointer / referensi ke LinkedListNode di LinkedList sebagai nilai.
Anda perlu mengoordinasikan penyisipan dan pemindahan untuk menjaga indeks Anda tetap sinkron dengan koleksi utama (LinkedList) dan pemindahan akan cukup mahal menurut saya. Ini mirip dengan cara kerja indeks basis data - mereka fantastis untuk pencarian tetapi mereka menjadi beban ketika Anda perlu melakukan banyak insetions dan delesi.
Semua hal di atas hanya dibenarkan jika Anda akan melakukan beberapa pencarian berat. Jika Anda hanya perlu menampilkannya sekali diurutkan berdasarkan frekuensi maka Anda bisa menghasilkan daftar tupel (anonim):
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
yang melakukan trik (benar bahwa itu menerima kunci untuk dibandingkan, tetapi dengan kunci, Anda bisa mendapatkan nilai). ;-)