C# में List<T> सॉर्ट करना: 5 मिनट में अव्यवस्था से व्यवस्था तक
\n\nकल्पना करें: आपके पास उपयोगकर्ताओं की एक सूची है, और आपको उन्हें उपनाम के वर्णमाला क्रम में स्क्रीन पर प्रदर्शित करना है। या उत्पादों की एक सूची — कीमत के अनुसार सस्ते से महंगे क्रम में सॉर्ट करना है। परिचित कार्य? Stack Overflow पर प्रश्न «How to Sort a List<T> by a property in the object» ने हजारों बार देखा गया है — इसका मतलब है कि यह विषय कई डेवलपर्स को चिंतित करता है।
\n\nइस लेख में हम C# में सूची सॉर्ट करने के पांच तरीकों पर चर्चा करेंगे। आप सीखेंगे कि एक गुण, कई फ़ील्ड के अनुसार कैसे सॉर्ट करें, और सॉर्टिंग को अधिकतम तेज़ कैसे बनाएं। चलिए शुरू करते हैं!
\n\nहम क्या सॉर्ट करेंगे: User क्लास
\n\nउदाहरणों के लिए हम एक सरल डेटा मॉडल लेंगे — नाम, आयु और रेटिंग वाला उपयोगकर्ता।
\n\npublic class User\n{\n public string Name { get; set; }\n public int Age { get; set; }\n public double Rating { get; set; }\n\n public override string ToString()\n {\n return $"{Name} ({Age}) — {Rating:F2}";\n }\n}\n\nएक परीक्षण सूची बनाते हैं:
\n\nList<User> users = new List<User>\n{\n new User { Name = "Анна", Age = 30, Rating = 4.5 },\n new User { Name = "Борис", Age = 25, Rating = 3.8 },\n new User { Name = "Виктор", Age = 35, Rating = 4.9 },\n new User { Name = "Галина", Age = 28, Rating = 4.2 }\n};\n\nतरीका 1: LINQ OrderBy — सबसे सरल और सुरुचिपूर्ण
\n\nयदि आप किसी ऑब्जेक्ट के गुण के अनुसार List<T> को सॉर्ट करना चाहते हैं जल्दी और बिना अतिरिक्त कोड के — LINQ का उपयोग करें। OrderBy विधि एक नया क्रमबद्ध अनुक्रम बनाती है, मूल सूची को बदले बिना। यह तब आदर्श है जब «चलते-फिरते» सॉर्टिंग की आवश्यकता हो।
// नाम के अनुसार सॉर्ट करना (आरोही क्रम में)\nvar sortedByName = users.OrderBy(u => u.Name).ToList();\n\n// आयु के अनुसार सॉर्ट करना (अवरोही क्रम में)\nvar sortedByAgeDesc = users.OrderByDescending(u => u.Age).ToList();\n\n// कई फ़ील्ड के अनुसार सॉर्ट करना: पहले आयु, फिर रेटिंग\nvar sortedMulti = users\n .OrderBy(u => u.Age)\n .ThenBy(u => u.Rating)\n .ToList();\n\nलाभ: पठनीयता, सॉर्टिंग श्रृंखलाएँ, किसी भी प्रकार के गुणों के साथ काम करता है।
\nनुकसान: एक नई सूची बनाता है (अतिरिक्त मेमोरी)।
तरीका 2: List.Sort डेलीगेट Comparison के साथ — मूल स्थान पर सॉर्टिंग
\n\nयदि आपको C# सूची को सॉर्ट करने की आवश्यकता है बिना प्रतिलिपि बनाए (मेमोरी बचाने के लिए), तो लैम्ब्डा एक्सप्रेशन के साथ Sort विधि का उपयोग करें। यह तरीका मूल संग्रह को बदलता है।
// नाम के अनुसार सॉर्ट करना (मूल स्थान पर)\nusers.Sort((a, b) => string.Compare(a.Name, b.Name, StringComparison.Ordinal));\n\n// आयु के अनुसार सॉर्ट करना (अवरोही क्रम में)\nusers.Sort((a, b) => b.Age.CompareTo(a.Age));\n\n// रेटिंग के अनुसार सॉर्ट करना\nusers.Sort((a, b) => a.Rating.CompareTo(b.Rating));\n\nलाभ: नई ऑब्जेक्ट नहीं बनाता, बड़ी सूचियों के लिए तेज़।
\nनुकसान: जटिल सॉर्टिंग में कम पठनीय।
तरीका 3: IComparable का कार्यान्वयन — «बॉक्स से बाहर» सॉर्टिंग
\n\nयदि आपकी क्लास को हमेशा एक ही फ़ील्ड (जैसे नाम) के अनुसार सॉर्ट किया जाना चाहिए, तो IComparable<T> इंटरफ़ेस लागू करें। तब List.Sort() बिना तर्कों के काम करेगा।
public class User : IComparable<User>\n{\n // ... ऊपर दिए गए उदाहरण से गुण ...\n\n public int CompareTo(User other)\n {\n if (other == null) return 1;\n return string.Compare(this.Name, other.Name, StringComparison.Ordinal);\n }\n}\n\n// उपयोग\nusers.Sort(); // स्वचालित रूप से नाम के अनुसार\n\nलाभ: व्यावसायिक तर्क के लिए प्राकृतिक सॉर्टिंग।
\nनुकसान: एक नियम को कठोरता से सेट करता है — अन्य फ़ील्ड के लिए अलग तर्क लिखना होगा।