LINQ में Group by: वास्तविक उदाहरणों के साथ ग्रुपिंग को समझें
\n\nअगर आपने C# में कभी कलेक्शन पर क्वेरी लिखी है, तो आपने जरूर सोचा होगा: "डेटा को ग्रुप कैसे करूं?" Stack Overflow पर group by in LINQ का टॉपिक सबसे लोकप्रिय है (हजारों व्यूज)। यह कोई संयोग नहीं है: ग्रुपिंग पहली नज़र में आसान लगती है, लेकिन असल में शुरुआती लोग अक्सर फंस जाते हैं — जैसे ग्रुप से पहला रिकॉर्ड कैसे चुनें, योग कैसे निकालें, या नेस्टेड ग्रुपिंग कैसे करें।
\n\nइस लेख में हम LINQ GroupBy से जुड़े 5 सबसे आम सवालों के काम के जवाब देंगे। चलिए शुरू करते हैं!
\n\n1. LINQ में GroupBy कैसे काम करता है? बेसिक सिंटैक्स
\n\nGroupBy मेथड SQL के GROUP BY स्टेटमेंट की तरह है। यह डेटा को एक निश्चित की (key) के आधार पर ग्रुप में बांटता है। रिजल्ट IGrouping<TKey, TElement> ऑब्जेक्ट्स का कलेक्शन होता है, जहां हर ऑब्जेक्ट में एक की और उस ग्रुप के सभी एलिमेंट होते हैं।
यहाँ एक सरल उदाहरण है। मान लीजिए हमारे पास छात्रों की लिस्ट है:
\n\npublic class Student\n{\n public string Name { get; set; }\n public string Group { get; set; }\n public int Score { get; set; }\n}\n\nvar students = new List<Student>\n{\n new Student { Name = "अन्ना", Group = "A", Score = 85 },\n new Student { Name = "बोरिस", Group = "B", Score = 90 },\n new Student { Name = "विका", Group = "A", Score = 78 },\n new Student { Name = "ग्लेब", Group = "B", Score = 92 }\n};\n\nग्रुप के नाम के आधार पर ग्रुप करें:
\n\nvar grouped = students.GroupBy(s => s.Group);\n\nforeach (var group in grouped)\n{\n Console.WriteLine($"ग्रुप: {group.Key}");\n foreach (var student in group)\n {\n Console.WriteLine($" {student.Name} — {student.Score}");\n }\n}\n\nआउटपुट:
\nग्रुप: A\n अन्ना — 85\n विका — 78\nग्रुप: B\n बोरिस — 90\n ग्लेब — 92\n\nयह आसान है। लेकिन असली मुश्किल बारीकियों में है।
\n\n2. हर ग्रुप से पहला रिकॉर्ड कैसे चुनें?
\n\nयह group by in LINQ पर सबसे लोकप्रिय सवाल है। मान लीजिए हमें हर ग्रुप से एक सबसे अच्छा छात्र चुनना है (सबसे ज्यादा स्कोर वाला)। यह कैसे करें?
\n\nहल — GroupBy को First() या OrderByDescending के साथ जोड़ें:
var bestStudents = students\n .GroupBy(s => s.Group)\n .Select(g => g.OrderByDescending(s => s.Score).First());\n\nforeach (var student in bestStudents)\n{\n Console.WriteLine($"{student.Name} — {student.Group} — {student.Score}");\n}\n\nपरिणाम: अन्ना (85) और ग्लेब (92)। ध्यान दें: Select के अंदर हम ग्रुप को सॉर्ट करते हैं और पहला एलिमेंट लेते हैं। यही है "LINQ group by first" का जवाब।
महत्वपूर्ण: अगर ग्रुप खाली है तो First() एक्सेप्शन फेंकेगा। अगर ऐसा हो सकता है, तो FirstOrDefault() का उपयोग करें।
3. ग्रुप के हिसाब से योग, गिनती या औसत कैसे निकालें?
\n\nग्रुपिंग के बाद अक्सर एलिमेंट्स को ट्रैवर्स करने के बजाय एग्रीगेटेड वैल्यू चाहिए होती है। जैसे, हर ग्रुप के स्कोर का योग या औसत।
\n\nSum, Count, Average का उपयोग करें:
var groupStats = students\n .GroupBy(s => s.Group)\n .Select(g => new\n {\n Group = g.Key,\n Count = g.Count(),\n TotalScore = g.Sum(s => s.Score),\n AverageScore = g.Average(s => s.Score)\n });\n\nforeach (var stat in groupStats)\n{\n Console.WriteLine($"ग्रुप {stat.Group}: {stat.Count} छात्र, कुल {stat.TotalScore}, औसत {stat.AverageScore:F2}");\n}\n\nआउटपुट:
\nग्रुप A: 2 छात्र, कुल 163, औसत 81.50\nग्रुप B: 2 छात्र, कुल 182, औसत 91.00\n\nआप Min और Max का भी उपयोग कर सकते हैं —