عملگر GroupBy در LINQ

چهارشنبه 6 خرداد 1394

در این مقاله به بحث درمورد عملگر GroupBy در LINQ می پردازیم. می آموزیم که چگونه می توانیم رکوردها را گروه بندی و مرتب سازی کنیم. همچنین می آموزیم که چگونه میتوانیم داده ها را براساس کلید چندگانه گروه بندی کنیم.

عملگر GroupBy در LINQ

عملگر GroupBy  در Linq رشته ای از آیتم ها را دریافت می کند، این رشته ها را بعد از دریافت بر اساس یک کلید مشخص مرتب می کند و یک رشته از گروه بندی <K,V> برمیگرداند، در اینجا K کلید مرتب سازی و V مقادیر هستند. این فقط یک یک عملگر است که به دسته بندی Grouping Operators تعلق دارد.

در ادامه یک برنامه کاربردی تحت کنسول در اختیار شما قرار دادیم که میخواهیم به بحث درمورد آن بپردازیم.

یک کلاس با نام Student با 3 ویژگی ایجاد می کنیم.

class Student {  
    public string Name {  
        get;  
        set;  
    }  
    public string Gender {  
        get;  
        set;  
    }  
    public string StudentType {  
        get;  
        set;  
    }  
}   

کدهایی که در متد Main برنامه نوشته میشوند:

class Program {
        static void Main(string[] args) {
            List<Student> StudentList = new List<Student>() {
                new Student(){ Name = "Ali", Gender="Male", StudentType="Diploma"},
                new Student(){ Name = "Sara", Gender="Male", StudentType="Graduate"},
                new Student(){ Name = "zahra", Gender="Male", StudentType="Diploma"},
                new Student(){ Name = "kiyan", Gender="Male", StudentType="Graduate"},
                new Student(){ Name = "Mahsa", Gender="Male", StudentType="Diploma"},
                new Student(){ Name = "Parham", Gender="Female", StudentType="Graduate"},
                new Student(){ Name = "Javid", Gender="Female", StudentType="Diploma"},
                new Student(){ Name = "Daryosh", Gender="Female", StudentType="Graduate"},
                new Student(){ Name = "Ehsan", Gender="Male", StudentType="Diploma"},
                new Student(){ Name = "Noshin", Gender="Male", StudentType="Graduate"}
            };
}

مثال 1

در ابتدای کار می خواهیم اطلاعات تعدادی دانش آموز را بگیریم و همه آنها را با StudentType دسته بندی کنیم.

var student = from students in StudentList

با students.StudentType دانش آموزان را گروه بندی می کنیم.

اولین مثال نشان می دهد که ما از  یک پرسش و پاسخ (Query) مانند SQL برای گروه بندی دانش آموزان با StudentType استفاده می کنیم.

جهت ایجاد یک کلید ما نیاز داریم که Forewch زیر را به برنامه اضافه کنیم، به عبارت دیگر StudentType و مجموعه ای از دانش آموزان به یک StudentType مشخص  اختصاص دارند.

   var student01 = from students in StudentList
                          group students by students.StudentType;
            foreach (var stud01 in student01)
            {
                Console.WriteLine(stud01.Key + " = " + stud01.Count());
            } 

خروجی کد

میتوانیم چند کار مشابه با استفاده از متد GroupBy در فضای نام System.Linq انجام دهیم.

مثال 2

حال برای لیست کردن نام دانش آموزان از حلقه تودرتو استفاده می کنیم. حلقه اول دانش آموزان را با استفاده از GroupBy دسته بندی کرده و حلقه دوم در هر دسته بندی لیستی از نام دانش آموزان را نشان می دهد.

 var student = from students in StudentList
                          group students by students.StudentType;

            //foreach loop
            foreach (var s in student)
            {
                Console.WriteLine(s.Key + " ---- " + s.Count());
                foreach (var ss in s)
                {
                    Console.WriteLine(ss.Name);
                }
            }

خروجی برنامه

مثال 3

در مثال بعدی میخواهیم نام دانش آموزان را به ترتیت حروف الفبا مرتب کنیم. برای این کار از متد OrderByDescending و ThenBy LINQ استفاده می کنیم.

var stud = from students in StudentList.OrderByDescending(x => x.StudentType).ThenBy(y => y.Name)
                       group students by students.StudentType;

            foreach (var item in stud)
            {
                Console.WriteLine("----------" + item.Key + "----------");
                foreach (var x in item)
                {
                    Console.WriteLine(x.Name);
                }
            }

در مثال 2 ما نام دانش آموزان را به صورت نامرتب نمایش دادیم.

خروجی برنامه بعد از مرتب سازی

در خروجی بالا میبینیم که گروه بندی دانش آموزان بر اساس Key به صورت نزولی و لیست نام دانش آموزان به صورت صعودی مرتب شد.

در مثال بعدی میبینیم که مرتب سازی لیست نام دانش آموزان براساس کلیدهای چندگانه انجام می شود.

مثال 4

 var studentByMultipleKey = StudentList.GroupBy(x => new { x.StudentType, x.Gender })
                .OrderBy(x => x.Key.StudentType)
                .ThenBy(x => x.Key.Gender)
                .Select(x => new
                {
                    StudentType = x.Key.StudentType,
                    Gender = x.Key.Gender,
                    Stud = x.OrderBy(y => y.Name)
                });

            foreach (var item in studentByMultipleKey)
            {
                Console.WriteLine("{0} Students with Gender {1} ", item.StudentType, item.Gender);
                foreach (var i in item.Stud)
                {
                    Console.WriteLine(i.Name);
                }
                Console.WriteLine();
            }

خر.جی برنامه

شرح کامل برنامه

برای گروه بندی رشته ها براساس کلیدهای چندگانه، نیاز به پاس دادن یک متد(anonymous) بی نام  Lambda در متد GroupyBy extension method داریم.

    StudentList.GroupBy(x => new { x.StudentType, x.Gender })  

اولین گروه از دانش آموزان را براساس StudentType و بعد براساس جنسیت گروه بندی کردیم.

در قدم بعدی از عملگر OrderBy برای مرتب سازی StudentType به ترتیب صعودی و سپس براساس جنسیت میپردازیم.

    OrderBy(x => x.Key.StudentType)  
    ThenBy(x => x.Key.Gender)  

عملگر Select در برنامه هایی یک نوع بی نام (anonymous) جدید وجود دارد مورد استفاده قرار میگیرد.

    Select(x = > new   
    {  
        StudentType = x.Key.StudentType,  
        Gender = x.Key.Gender,  
        Stud = x.OrderBy(y = > y.Name)  
    });

 

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 4k بازدید
  • 2 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید