คุณไม่เรียงลำดับรายการในพจนานุกรม คลาสพจนานุกรมใน. NET ถูกนำมาใช้เป็น hashtable - โครงสร้างข้อมูลนี้ไม่สามารถจัดเรียงตามนิยาม
หากคุณจำเป็นต้องสามารถวนซ้ำคอลเลกชันของคุณ (โดยคีย์) - คุณต้องใช้ SortedDictionary ซึ่งถูกนำมาใช้เป็นแผนผังการค้นหาแบบไบนารี
ในกรณีของคุณอย่างไรก็ตามโครงสร้างของแหล่งข้อมูลนั้นไม่เกี่ยวข้องเนื่องจากถูกจัดเรียงตามเขตข้อมูลอื่น คุณจะต้องเรียงลำดับตามความถี่และเก็บไว้ในคอลเล็กชันใหม่เรียงตามฟิลด์ที่เกี่ยวข้อง (ความถี่) ดังนั้นในคอลเล็กชั่นนี้ความถี่จึงเป็นกุญแจและคำเป็นค่า เนื่องจากคำหลายคำสามารถมีความถี่เท่ากัน (และคุณจะใช้เป็นคีย์) คุณจึงไม่สามารถใช้ทั้งพจนานุกรมและ SortedDictionary (ต้องใช้คีย์ที่ไม่ซ้ำกัน) สิ่งนี้ทำให้คุณมี SortedList
ฉันไม่เข้าใจว่าทำไมคุณยืนยันในการรักษาลิงก์ไปยังรายการต้นฉบับในพจนานุกรมหลัก / แรกของคุณ
หากวัตถุในคอลเลกชันของคุณมีโครงสร้างที่ซับซ้อนมากขึ้น (เขตข้อมูลเพิ่มเติม) และคุณจำเป็นต้องสามารถเข้าถึง / จัดเรียงได้อย่างมีประสิทธิภาพโดยใช้เขตข้อมูลที่แตกต่างกันเป็นคีย์ - คุณอาจต้องใช้โครงสร้างข้อมูลแบบกำหนดเองที่ประกอบด้วยหน่วยเก็บข้อมูลหลัก รองรับการแทรกและกำจัด O (1) (LinkedList) และโครงสร้างการจัดทำดัชนีหลายรายการ - พจนานุกรม / SortedDictionaries / SortedLists ดัชนีเหล่านี้จะใช้หนึ่งในฟิลด์จากคลาสที่ซับซ้อนของคุณเป็นคีย์และตัวชี้ / การอ้างอิงถึง 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
เคล็ดลับ (จริงว่ามันยอมรับคีย์เพื่อเปรียบเทียบ แต่ด้วยคีย์คุณจะได้รับค่า) ;-)