عملگر تجمیع Aggregate
در LINQ، عملگرهای تجمیع به منظور انجام اعمال ریاضی مانند Average، Aggregate، Count، Max، Min و Sum بر روی عناصر عددی مجموعه استفاده می شوند.
متد | توضیحات |
Aggregate | یک عمل تجمیع سفارشی بر روی مقادیر موجود در یک مجموعه را انجام می دهد. |
Average | میانگین عناصر عددی موجود در مجموعه را محاسبه می کند. |
Count | برای شمارش تعداد عناصر موجود در یک مجموعه استفاده می شود. |
LongCount | برای شمارش تعداد عناصر موجود در یک مجموعه استفاده می شود. تفاوتی که با متد فوق دارد این است که مقدار بازگشتی از نوع Int64 است. بنابراین زمانی از این متد استفاده کنید که فکر میکنید تعداد عناصر از MaxValue نوع Int32 بیشتر باشد. |
Max | عنصری که بیشترین مقدار را داشته باشد باز میگرداند. |
Min | عنصری که کمترین مقدار را داشته باشد باز میگرداند. |
Sum | جمع مقادیر مجموعه را باز میگرداند. |
متد Aggregate
متد Aggregate به منظور انجام یک عمل تجمیع سفارشی بر روی مقادیر مجموعه استفاده می شود. در زیر می توانید overload های مربوط به این متد را مشاهده کنید:
1 2 3 4 5 6 7 8 9 10 11 | public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func); public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func); public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector); |
در مثال زیر با استفاده از این متد، عناصر موجود در مجموعه را به صورت با کاما به هم متصل کرده ایم:
1 2 3 | IList<String> strList = new List<String>() { "One", "Two", "Three", "Four", "Five"}; var commaSeperatedString = strList.Aggregate((s1, s2) => s1 + ", " + s2); Console.WriteLine(commaSeperatedString); |
خروجی:
1 | One, Two, Three, Four, Five |
در تصویر زیر می توانید عملیات انجام شده در مثال فوق را مشاهده کنید:
متد Aggregate با مقدار Seed
متد Arregate یک overload دیگر نیز دارد که در آن پارامتر اول یک مقدار به عنوان Seed می گیرد و پارامتر دوم یک Func. سینتکس متد به این صورت است:
1 | TAccumulate Aggregate<TSource, TAccumulate>(TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func); |
در مثال زیر از یک رشته به عنوان مقدار Seed استفاده کرده ایم:
1 2 3 4 5 6 7 8 9 10 11 12 | // Student collection IList<Student> studentList = new List<Student>>() { new Student() { StudentID = 1, StudentName = "John", Age = 13} , new Student() { StudentID = 2, StudentName = "Moin", Age = 21 } , new Student() { StudentID = 3, StudentName = "Bill", Age = 18 } , new Student() { StudentID = 4, StudentName = "Ram" , Age = 20} , new Student() { StudentID = 5, StudentName = "Ron" , Age = 15 } }; string commaSeparatedStudentNames = studentList.Aggregate<Student, string>( "Student Names: ", // seed value (str, s) => str += s.StudentName + "," ); Console.WriteLine(commaSeparatedStudentNames); |
خروجی مثال:
1 | Student Names: John, Moin, Bill, Ram, Ron, |
در مثال فوق، مقدار “Student Names: “ به عنوان Seed ارسال شده است. مقدار Seed با نتیجه عملیات جمع میشود. در مثال زیر با استفاده از عملگر Aggregate سن دانش آموزان را با هم جمع میکنیم:
1 2 3 4 5 6 7 8 9 10 | // Student collection IList<Student> studentList = new List<Student>>() { new Student() { StudentID = 1, StudentName = "John", Age = 13} , new Student() { StudentID = 2, StudentName = "Moin", Age = 21 } , new Student() { StudentID = 3, StudentName = "Bill", Age = 18 } , new Student() { StudentID = 4, StudentName = "Ram" , Age = 20} , new Student() { StudentID = 5, StudentName = "Ron" , Age = 15 } }; int SumOfStudentsAge = studentList.Aggregate<Student, int>(0, (totalAge, s) => totalAge += s.Age ); |
متد Aggregate با Result Selector
در این بخش سومین overload این متد را بررسی میکنیم که یک Result Selector است به این معنی که نتیجه نهایی را انتخاب می کند. اگر به مثال بخش قبل نگاه کنید متوجه می شوید که یک کاما در انتهای نتیجه اضافی است. با استفاده از Result Selector می توانیم مانند نمونه زیر آن را حذف کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 | IList<Student> studentList = new List<Student>>() { new Student() { StudentID = 1, StudentName = "John", Age = 13} , new Student() { StudentID = 2, StudentName = "Moin", Age = 21 } , new Student() { StudentID = 3, StudentName = "Bill", Age = 18 } , new Student() { StudentID = 4, StudentName = "Ram" , Age = 20} , new Student() { StudentID = 5, StudentName = "Ron" , Age = 15 } }; string commaSeparatedStudentNames = studentList.Aggregate<Student, string,string>( String.Empty, // seed value (str, s) => str += s.StudentName + ",", // returns result using seed value, String.Empty goes to lambda expression as str str => str.Substring(0,str.Length - 1 )); // result selector that removes last comma Console.WriteLine(commaSeparatedStudentNames); |
خروجی مثال:
1 | John, Moin, Bill, Ram, Ron |
هیچ نظری ثبت نشده است