आप शब्दकोश में प्रविष्टियों को क्रमबद्ध नहीं करते हैं। .NET में डिक्शनरी क्लास को हैशटेबल के रूप में लागू किया गया है - यह डेटा संरचना परिभाषा के अनुसार क्रमबद्ध नहीं है।
यदि आपको अपने संग्रह (कुंजी द्वारा) को पुनरावृत्त करने में सक्षम होने की आवश्यकता है - आपको सॉर्टेडबेडर का उपयोग करने की आवश्यकता है, जिसे बाइनरी ट्री ट्री के रूप में कार्यान्वित किया जाता है।
आपके मामले में, हालांकि स्रोत संरचना अप्रासंगिक है, क्योंकि यह एक अलग क्षेत्र द्वारा सॉर्ट किया गया है। आपको अभी भी इसे आवृत्ति द्वारा सॉर्ट करना होगा और इसे संबंधित फ़ील्ड (फ़्रीक्वेंसी) द्वारा सॉर्ट किए गए नए संग्रह में रखना होगा। तो इस संग्रह में आवृत्तियाँ कुंजियाँ हैं और शब्द मान हैं। चूंकि कई शब्दों में समान आवृत्ति हो सकती है (और आप इसे एक कुंजी के रूप में उपयोग करने जा रहे हैं) आप न तो डिक्शनरी और न ही सॉर्टेडबॉडी (वे अद्वितीय कुंजी की आवश्यकता होती है) का उपयोग नहीं कर सकते हैं। यह आपको एक SortedList के साथ छोड़ देता है।
मुझे समझ में नहीं आता कि आप अपने मुख्य / पहले शब्दकोश में मूल आइटम के लिंक को बनाए रखने पर जोर क्यों देते हैं।
यदि आपके संग्रह की वस्तुओं में एक अधिक जटिल संरचना (अधिक क्षेत्र) थी और आपको कुंजी के रूप में कई अलग-अलग क्षेत्रों का उपयोग करके उन्हें कुशलतापूर्वक एक्सेस / सॉर्ट करने में सक्षम होना चाहिए - आपको संभवतः एक कस्टम डेटा संरचना की आवश्यकता होगी जिसमें मुख्य भंडारण शामिल होगा O (1) सम्मिलन और निष्कासन (लिंक्डलिस्ट) और कई अनुक्रमण संरचनाओं का समर्थन करता है - शब्दकोश / SortedD शब्दकोशों / SortedLists। ये इंडेक्स आपके कॉम्प्लेक्स क्लास से एक फ़ील्ड को एक कुंजी के रूप में और एक लिंक्डइन में लिंक्डइनिस्ट के लिए एक पॉइंटर / संदर्भ के रूप में एक मूल्य के रूप में उपयोग करेगा।
आपको अपने अनुक्रमणिका को मुख्य संग्रह (लिंक्डलिस्ट) के साथ सिंक में रखने के लिए सम्मिलन और हटाने के समन्वय की आवश्यकता होगी और निष्कासन मेरे विचार से बहुत महंगा होगा। यह उसी तरह है जैसे डेटाबेस अनुक्रमणिका कैसे काम करती है - वे लुकअप के लिए शानदार हैं लेकिन जब आप कई इंसेटिव और डिलीट करने की आवश्यकता होती है तो वे बोझ बन जाते हैं।
यदि आप कुछ लुक-अप हैवी प्रोसेसिंग करने जा रहे हैं, तो उपरोक्त सभी उचित है। यदि आपको केवल आवृत्ति द्वारा छांटे जाने के बाद उन्हें आउटपुट करने की आवश्यकता है तो आप (अनाम) टुपल्स की एक सूची तैयार कर सकते हैं:
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
ट्रिक भी बना सकते हैं (यह सच है कि यह तुलना करने के लिए एक कुंजी को स्वीकार करता है, लेकिन एक कुंजी के साथ, आप एक मान प्राप्त कर सकते हैं)। ;-)