আপনি অভিধানে এন্ট্রি বাছাই করবেন না। .NET এ অভিধানের ক্লাসটি হ্যাশটেবল হিসাবে প্রয়োগ করা হয় - এই ডেটা কাঠামো সংজ্ঞা অনুসারে বাছাইযোগ্য নয়।
আপনার সংগ্রহ (পুনরুদ্ধার করে) এর মাধ্যমে যদি আপনার পুনরাবৃত্তি করতে সক্ষম হয় - আপনার সোর্টার্ড ডিকোরিয়ানোটি ব্যবহার করতে হবে যা বাইনারি অনুসন্ধান ট্রি হিসাবে প্রয়োগ করা হয়।
আপনার ক্ষেত্রে তবে উত্সের কাঠামো অপ্রাসঙ্গিক, কারণ এটি আলাদা ক্ষেত্রের দ্বারা সাজানো হয়েছে। আপনার এখনও এটিকে ফ্রিকোয়েন্সি অনুসারে বাছাই করতে হবে এবং এটিকে প্রাসঙ্গিক ক্ষেত্র (ফ্রিকোয়েন্সি) অনুসারে বাছাই করা একটি নতুন সংগ্রহে রাখতে হবে। সুতরাং এই সংগ্রহে ফ্রিকোয়েন্সিগুলি কী এবং শব্দের মান। যেহেতু অনেক শব্দের একই ফ্রিকোয়েন্সি থাকতে পারে (এবং আপনি এটি কী হিসাবে ব্যবহার করতে যাচ্ছেন) আপনি অভিধান বা সোর্টডডিয়েশনারি ব্যবহার করতে পারবেন না (তাদের জন্য অনন্য কী প্রয়োজন)। এটি আপনাকে একটি সাজানো তালিকা সহ ছেড়ে দেয়।
আপনি কেন আপনার মূল / প্রথম অভিধানটিতে মূল আইটেমটির লিঙ্ক বজায় রাখতে জোর দিয়েছিলেন তা আমি বুঝতে পারি না।
যদি আপনার সংগ্রহে থাকা বস্তুগুলির আরও জটিল কাঠামো (আরও ক্ষেত্র) থাকে এবং আপনি কী হিসাবে বিভিন্ন ক্ষেত্রকে দক্ষতার সাথে অ্যাক্সেস করতে / সাজাতে সক্ষম হবেন - আপনার সম্ভবত সম্ভবত একটি কাস্টম ডেটা কাঠামো দরকার যা মূল স্টোরেজটি ধারণ করে যে ও (1) সন্নিবেশ এবং অপসারণ (লিংকডলিস্ট) এবং বেশ কয়েকটি সূচী কাঠামো - অভিধান / সোর্টার্ডডিকোরিয়ান্স / সোর্টার্ডগুলি সমর্থন করে। এই সূচকগুলি আপনার জটিল শ্রেণীর একটি ক্ষেত্রকে কী হিসাবে এবং লিঙ্কডলিস্টে লিঙ্কডলিস্টনোডের একটি পয়েন্টার / রেফারেন্স হিসাবে একটি মান হিসাবে ব্যবহার করবে।
মূল সূচী (লিংকডলিস্ট) এর সাথে আপনার সূচকগুলি সিঙ্কে রাখার জন্য আপনাকে সন্নিবেশ এবং অপসারণগুলির সমন্বয় করতে হবে এবং অপসারণগুলি আমার মনে হবে এমন ব্যয়বহুল হবে। এটি ডাটাবেস সূচকগুলি কীভাবে কাজ করে তার অনুরূপ - তারা দেখার জন্য দুর্দান্ত। তবে যখন আপনাকে অনেকগুলি ইনসেশন এবং মুছে ফেলার দরকার হয় তখন এগুলি বোঝা হয়ে যায়।
উপরের সমস্তগুলি কেবলমাত্র ন্যায়সঙ্গত যদি আপনি কিছু লুক আপ ভারী প্রক্রিয়াজাতকরণ করতে যাচ্ছেন। যদি আপনার কেবলমাত্র একবার ফ্রিকোয়েন্সি অনুসারে বাছাই করা দরকার হয় তবে আপনি কেবল (বেনামে) টিউপসগুলির একটি তালিকা তৈরি করতে পারেন:
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
কৌশলও তৈরি করতে পারেন যা ট্রিক করে তোলে (এটি সত্য যে এটি তুলনা করার জন্য একটি কী গ্রহণ করে তবে একটি কী দিয়ে আপনি একটি মান পেতে পারেন)। ;-)