C# में Dictionary को Value के आधार पर सॉर्ट करना: पूरी गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Dictionary को Value के आधार पर सॉर्ट करना क्यों मुश्किल है (और इसका समाधान)

\n\n

क्या आप कभी ऐसी स्थिति में आए हैं: आपके पास Dictionary<string, int> है जिसमें दर्जनों एंट्री हैं, और आप उन्हें लोकप्रियता के घटते क्रम में दिखाना चाहते हैं? जैसे, टेक्स्ट में सबसे ज़्यादा आने वाले शब्दों की सूची या टॉप-10 बिकने वाले प्रोडक्ट। यह काम आसान लगता है, लेकिन C# में सामान्य Dictionary डेटा को बिना किसी क्रम के स्टोर करता है। Stack Overflow पर सवाल "How do you sort a dictionary by value?" को हज़ारों व्यूज़ मिले हैं — और यह कोई संयोग नहीं है।

\n\n

इस ट्यूटोरियल में हम C# में Dictionary को Value के आधार पर सॉर्ट करने के सभी सही तरीकों पर चर्चा करेंगे: सरल LINQ हैक से लेकर खुद का ऑर्डर्ड डिक्शनरी बनाने तक। आप जानेंगे कि कौन सा तरीका सबसे अच्छा प्रदर्शन और कोड पठनीयता देता है।

\n\n

Dictionary खुद से सॉर्ट क्यों नहीं होती?

\n\n

कोड में जाने से पहले, Dictionary<TKey, TValue> की प्रकृति को समझ लेते हैं। यह डेटा टाइप एक हैश टेबल है। इसे की के आधार पर तेज़ी से खोजने के लिए ऑप्टिमाइज़ किया गया है, न कि एलिमेंट्स को एक निश्चित क्रम में स्टोर करने के लिए। जब आप कोई एलिमेंट जोड़ते हैं, तो वह की के हैश के आधार पर एक "बकेट" में चला जाता है। कोई सॉर्टिंग नहीं होती।

\n\n

अगर आपको सॉर्टेड आउटपुट चाहिए — तो आपको खुद हस्तक्षेप करना होगा। अच्छी खबर: C# कई सुंदर समाधान प्रदान करता है।

\n\n

तरीका 1: LINQ — सबसे लोकप्रिय तरीका (Stack Overflow के जवाब की तरह)

\n\n

सबसे आसान और अक्सर इस्तेमाल किया जाने वाला तरीका है LINQ और OrderBy या OrderByDescending मेथड का उपयोग करना। यह तब आदर्श है जब आपको डेटा को एक बार प्रदर्शित करने या एक्सपोर्ट करने के लिए सॉर्ट करना हो।

\n\n
using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nvar fruits = new Dictionary<string, int>\n{\n    {"apple", 5},\n    {"banana", 3},\n    {"orange", 8},\n    {"grape", 1}\n};\n\n// Value के बढ़ते क्रम में सॉर्ट करना\nvar sortedAsc = fruits.OrderBy(pair => pair.Value);\n\n// Value के घटते क्रम में सॉर्ट करना\nvar sortedDesc = fruits.OrderByDescending(pair => pair.Value);\n\nConsole.WriteLine("बढ़ते क्रम में:");\nforeach (var item in sortedAsc)\n{\n    Console.WriteLine($"{item.Key}: {item.Value}");\n}\n\nConsole.WriteLine("\\nघटते क्रम में:");\nforeach (var item in sortedDesc)\n{\n    Console.WriteLine($"{item.Key}: {item.Value}");\n}
\n\n

परिणाम:

\n
बढ़ते क्रम में:\ngrape: 1\nbanana: 3\napple: 5\norange: 8\n\nघटते क्रम में:\norange: 8\napple: 5\nbanana: 3\ngrape: 1
\n\n

यह कैसे काम करता है?

\n

OrderBy एक IOrderedEnumerable<KeyValuePair<string, int>> लौटाता है — एक सीक्वेंस जो "आलसी" तरीके से सॉर्ट होता है (पहली बार लूप करने पर ही)। यह नया Dictionary नहीं है, बल्कि एक प्रोजेक्शन है। अगर आपको परिणाम को सेव करना है, तो इसे .ToDictionary() का उपयोग करके वापस Dictionary में बदलें।

\n\n

महत्वपूर्ण: ToDictionary एक सामान्य Dictionary बनाता है, जो फिर से क्रम की गारंटी नहीं देता। अगर क्रम महत्वपूर्ण है — तो SortedDictionary या टपल्स की सूची का उपयोग करें।

\n\n

तरीका 2: SortedDictionary — जब क्रम लगातार चाहिए

\n\n

अगर आप बार-बार सॉर्टेड डेटा का उपयोग करने की योजना बना रहे हैं, तो SortedDictionary का उपयोग करना बेहतर है। यह क्लास अपने आप की के आधार पर सॉर्टिंग बनाए रखता है। लेकिन हमें तो value के आधार पर चाहिए!

\n\n

चाल: हम SortedDictionary को सीधे value के आधार पर सॉर्ट नहीं कर सकते। लेकिन हम कस्टम कम्पेरेटर के साथ SortedDictionary का उपयोग कर सकते हैं या, इससे भी आसान, एक सहायक क्लास बना सकते हैं।

\n\n
using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nvar fruits = new Dictionary<string, int>\n{\n    {"apple", 5},\n    {"banana", 3},\n    {"orange", 8},\n    {"grape"                

ब्लॉग

पुस्तक अनुशंसाएँ