LINQ to Object Part #3: Grouping

Objective

In this article, I am going to show, how we could achieve grouping in LINQ to object

I have created two classes for my explanation purpose. Student class is having details of students and Hostel class is having details of hostel. Both classes are having a properties HostelNumber common. I will be using this property to perform join operations in later articles. Both classes are as below.

Student.cs

    1 using System;

    2 using System.Collections.Generic;

    3 using System.Linq;

    4 using System.Text;

    5 

    6 namespace LINQtoOBJECT1

    7 {

    8      public  class Student

    9     {

   10 

   11          public int RollNumber { get; set; }

   12          public string Name { get; set; }

   13          public int Section { get; set; }

   14          public int HostelNumber { get; set; }

   15     }

   16 }

   17 

   Hostel.cs                    

    3 using System.Linq;

    4 using System.Text;

    5 

    6 namespace LINQtoOBJECT1

    7 {

    8    public class Hostel

    9     {

   10 

   11        public int HostelNumber { get; set; }

   12        public int NumberofRooms { get; set; }

   13     }

   14 }

   15 


To create collection of students and hostels, I am creating two static functions.

Function to return collection of students.

    1    static List<Student> GetStudents()

    2         {

    3             List<Student> students = new List<Student>

    4             {

    5                 new Student() { RollNumber = 1,Name =“Alex “ , Section =  1 ,HostelNumber=1 },

    6                 new Student() { RollNumber = 2,Name =“Jonty “ , Section = 2 ,HostelNumber=2 },

    7                 new Student() { RollNumber = 3,Name =“Samba “ , Section = 3 ,HostelNumber=1 },

    8                 new Student() { RollNumber = 4,Name =“Donald “ , Section = 3 ,HostelNumber=2 },

    9                 new Student() { RollNumber = 5,Name =“Kristen “ , Section = 2 ,HostelNumber=1 },

   10                 new Student() { RollNumber = 6,Name =“Mark “ , Section = 1 ,HostelNumber=2},

   11                 new Student() { RollNumber = 7,Name =“Gibbs “ , Section = 1 ,HostelNumber=1 },

   12                 new Student() { RollNumber = 8,Name =“Peterson “ , Section = 2 ,HostelNumber=2 },

   13                 new Student() { RollNumber = 9,Name =“collingwood “ , Section = 3 ,HostelNumber=1 },

   14                 new Student() { RollNumber = 10,Name =“Brian “ , Section = 3 ,HostelNumber=2 }

   15 

   16             };

   17 

   18             return students;

   19 

   20         }

 Function to return collection of hostels

    1  static List<Hostel> GetHostel()

    2         {

    3             List<Hostel> hostels = new List<Hostel>

    4             {

    5 

    6                 new Hostel(){HostelNumber=1 ,NumberofRooms = 100},

    7                 new Hostel(){HostelNumber= 2 ,NumberofRooms = 200}

    8             };

    9             return hostels;

   10         }


Now have a look on both codes below, one is using LINQ and other is using LOOP to retrieve data from the list and print.
Note: I will be using above two classes and functions for my entire sample below.
Grouping in LINQ


 Syntax of Groupby

Var result = FROM selectVariable IN dataSourceorList GROUPBY selectVariable.variable INTO RANGEVARIABLE Select new { };

Grouping by a single property

    1  class Program

    2     {

    3         static void Main(string[] args)

    4         {

    5 

    6 

    7           List<Student> lstStudents = GetStudents();

    8           var  lstStudentName = from r in lstStudents

    9                                                    group r by r.HostelNumber into rngStudent

   10                                                    select new

   11                                                    {

   12                                                        HostelID = rngStudent.Key,

   13                                                        Students = rngStudent

   14                                                    };

   15 

   16           foreach (var name in lstStudentName)

   17           {

   18               Console.WriteLine(name.HostelID);

   19               foreach (Student s in name.Students)

   20               {

   21                   Console.WriteLine(s.RollNumber + s.Name);

   22               }

   23           }

   24              Console.ReadKey();

   25 

   26         }

   27 

 

 

 Explanation

  1. I am grouping on property hostel number.
  2. rngStudent is range variable in which ; I am putting the intermediate result.
  3. I am selecting the result in as anonymous type.
  4. While printing the result , first I am printing the key of group by and then retrieving the object in foreach.

        1 foreach (var name in lstStudentName)

        2           {

        3               Console.WriteLine(name.HostelID);

        4               foreach (Student s in name.Students)

        5               {

        6                   Console.WriteLine(s.RollNumber + s.Name);

        7               }

        8           }

    Output


 Accessing the Group object

    1 foreach (var name in lstStudentName)

    2           {

    3               Console.WriteLine(name.HostelID);

    4               foreach (Student s in name.Students)

    5               {

    6                   Console.WriteLine(s.RollNumber + s.Name);

    7               }

    8           }

If you see the above loop , first I am looping the key for the group by clause and then , I am looping through IEnumerable LINQ object. This object is containing the real result.

Conclusion

In this article, I have discussed GROUPING in LINQ to OBJECT. Thanks for reading.


Discover more from Dhananjay Kumar

Subscribe to get the latest posts sent to your email.

Published by Dhananjay Kumar

Dhananjay Kumar is founder of NomadCoder and ng-India

One thought on “LINQ to Object Part #3: Grouping

Leave a comment

Discover more from Dhananjay Kumar

Subscribe now to keep reading and get access to the full archive.

Continue reading