تابع Aggregate در LINQ

شنبه 13 تیر 1394

در این مقاله توضیحاتی در مورد انواع تابع Aggregate ارائه شده است و با ذکر مثال به درک بیشتری از تابع Aggregate می پردازیم.

تابع Aggregate در LINQ

انواع توابع Aggregate عبارتند از :

1. Min

2. Max

3. Count

4. Sum

5. Average

6. Aggregate

این توابع در فضای نام System.Linq وجود دارد. در این مقاله برای هر یک از توابع یک مثال گفته شده است.

Min :

در این مثال یک Console application ایجاد می کنید که به ما کوچکترین عدد را از یک آرایه بدون استفاده از LINQ می دهد و ما یک برنامه مشابه توسط LINQ خواهیم نوشت.

در ویژوال استودیو یک Console application داریم که در آن کلاس برنامه با یک متد اصلی وجود دارد. در متد اصلی یک آرایه از اعداد ایجاد کردیم. در زیر مشاهده کنید:

در آرایه قبلی ما می خواهیم در Console window کوچکترین عدد را برگرداند و چاپ کند.

کوچکترین عدد چاپ را کند، در ابتدا نیاز داریم یک متغیر ایجاد کنیم که مقداری را در داخل آن نگه دارد.

برای ذخیره سازی کوچکترین عدد در متغیر LowsetNumber ،ما نیاز داریم که کوچکترین عدد را از ArrayOfNumber پیدا کنیم که برای انجام این کار ما می توانیم از یک حلقه foreach استفاده کنیم. 

ما برای برگرداندن تمام اعداد ArrayOfNumbers از یک حلقه foreach استفاده کردیم. بعد از بازگرداندن همه مقادیر، اگر متغیر null که ایجاد می کنیم دارای مقداری نباشد و متغیر n کوچکتر از متغیرLowestNumber باشد از or(||) استفاده می کنیم.

اگر هریک از این شرط ها درست بود، مقدار را از متغیر n به متغیر LowestNumber دخیره می کند.

وقتی که کد اجرا شد، در ابتدا بررسی می شود که آیا متغیر lowsetNumber دارای مقداری است یا خیر. اگر دارای مقدار نبود اولین مقدار از متغیر n به متغیر ArrayOfNumber انتقال داده خواهد شد. سپس دوباره حلقه اجرا شده و شرایط را بررسی خواهد کرد. اما اولین شرط نادرست خواهد بود زیرا LowestNumber دارای یک مقدار می باشد.سپس شرط دوم بررسی می شود و اگر مقدار n کوچکتر از LowestNumber باشد سپس مقدار n به متغیر LowestNumber انتقال داده خواهد شد. 

using System;  
  
namespace AggregateFunctionsInLINQ {  
   class Program {  
      static void Main(string[] args) {  
         int[] ArrayOfNumbers = { 5, 4, 6, 3, 7, 1, 3, 9 };  
         int? LowestNumber = null;  
  
  
         foreach(int n in ArrayOfNumbers) {  
            if(!LowestNumber.HasValue || n < LowestNumber) {  
               LowestNumber = n;  
            }  
         }  
         Console.WriteLine(LowestNumber);  
      }  
   }  
}  

برنامه را اجرا کنید.

برای گرفتن کوچکترین عدد ما باید کدهای زیادی بنویسیم در اینجا خواهیم گفت که چگونه این کار را توسط LINQ انجام بدیم. 

برای گرفتن کوچکترین عدد، ما می توانیم از این تابع Min() aggregate استفاده کنیم.

این تابع کمترین مقدار را به ترتیب برمی گرداند. سپس توسط متد extension کوچکترین مقدار را از ArrayOfNumber دریافت می کند.

using System;  
using System.Collections.Generic;  
using System.Linq;  
  
namespace SmallestNumberUsingLINQ {  
   class Program {  
      static void Main(string[] args) {  
         int[] ArrayOfNumbers = { 5, 4, 6, 3, 7, 1, 3, 9 };  
         int LowestNumber = ArrayOfNumbers.Min();  
         Console.WriteLine(LowestNumber);  
      }  
   }  
}  

برنامه را اجرا کنید.

Max :

به مثال زیر توجه کنید. بزرگترین عدد از ArrayOfNumber را بر می گرداند.

در فایل cs قبلی، ما کدی را نوشتیم که چک می کند آیا مقدار n از مقدار LargestNumber بزرگتراست یا خیر. اگر شرط درست باشد ،مقدار n را به متغیر LargestNumber انتقال میدهد.

برنامه را اجرا کنید.

در اینجا خواهید دید که چگونه توسط LINQ این کار را انجام می دهیم.

به منظور بدست آوردن کمترین مقدار از آرایه ای از integer ، ما از تابع Min aggregate استفاده کردیم و برای بدست آوردن بیشترین مقدار از آرایه ای از integer ، ما از تابع Max aggregate استفاده خواهیم کرد.

برنامه را اجرا کنید.

برای مثال، از تابع ArrayOfNumber ما می خواهیم بزرگترین اعداد زوج را بدست آوریم.

بدون استفاده از LINQ :

برای بدست آوردن بزرگترین اعداد زوج، ما نیاز داریم که یک شرط دیگر را اضافه کنیم که چک می کند آیا عدد 0 به عنوان باقی مانده بر می گرداند یا خیر.

برنامه را اجرا کنید.

استفاده از LINQ :

برای فیلترکردن رکوردها ما از متد Where می توانیم استفاده کنیم.

برنامه را اجرا کنید.

Sum :

در این نمونه کد مجموع تمام اعداد را پیدا می کند.

بدون استفاده از LINQ :

برنامه را اجرا کنید.

استفاده از LINQ :

به منظور بدست آوردن حاصل جمع همه اعداد، ما می توانیم از تابع Sum aggregate استفاده کنیم.

برنامه را اجرا کنید.

Count :

در این مثال تعداد عناصر را در ArrayOfNumbers نمایش میدهد.

بدون استفاده از LINQ :

برنامه را اجرا کنید.

استفاده از LINQ :

برنامه را اجرا کنید.

Average :

در این مثال نحوه بدست آوردن میانگین از ArrayOfNumbers را ارائه می دهد.

بدون استفاده از LINQ :

برنامه را اجرا کنید.

استفاده از LINQ:

به منظور بدست آوردن میانگین در LINQ، ما می توانیم از تابع Average aggregate استفاده کنیم.

نوع بازگشتی این تابع ، اعشاری است.

برنامه را اجرا کنید.

Aggregate :

 در این نمونه کد، ما نحوه استفاده از تابع Aggregate را خواهیم گفت.

در Console application ، آرایه ای از نام ها داریم.

string[] Names = {"Sam","Sara","Aiden","Trevor","Michael"};  

ما می خواهیم این رشته جداشده به یک رشته جدا شده تک ویرگولی نمایش داده شود.

بدون استفاده از LINQ :

برنامه را اجرا کنید :

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

خب ببینیم چطور میشود آن را حذف کرد. برای حذف یک کاما از آخرین رشته ما می توانیم از متد LastIndexOf استفاده کنیم.

برنامه را اجرا کنید.

استفاده از LINQ :

برنامه را اجرا کنید.

شاید فکر کنید که تابع Aggregate چگونه کار می کند ؟

اگر به عبارت (string SingleString = Names.Aggregate((a, b) => a + ", " + b نگاه کنید این عبارت (a,b) هیچ جیزی نیست به جز دو پارامتری از نوع  string می باشد.

وقتی که برنامه ای برای اولین بار اجرا می شود، sam و sara  به a,b انتقال داده می شود و بر اساس عبارت a + ", " + b این تابع aggregate، دو مقدار را توسط کاما جدا می کند و مقدار را به اولین پارامتر a انتقال می دهد.

آموزش سی شارپ

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

نرگس محمدی

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

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

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