عملگرهای تولید، برای ما توالی ایجاد میکنند و تفاوتهای عمدهای با سایر عملگرهای پرس و جو دارند که در بخش زیر به آنها اشاره میکنیم:
1- هیچ توالی ورودی را دریافت نمیکنند.
2- این عملگرها بصورت متد الحاقی پیاده سازی نشدهاند و بصورت متدهای استاتیک در کلاس Enumerable قرار گرفتهاند.
امضاء زیر مربوط به متد Empty میباشد:
public static IEnumerable<TResult> Empty<TResult>()
Empty
عملگر Empty یک توالی بدون عنصر (Empty) را بر اساس نوع مشخص شده، ایجاد میکند.
در کد زیر نحوه ایجاد یک توالی خالی از نوع Ingredient نشان داده شده است.
IEnumerable<Ingredient> ingredients = Enumerable.Empty<Ingredient>(); Console.WriteLine(ingredients.Count());
0
معادل عملگر Empty، کلمه کلیدی در عبارتهای جستجو وجود ندارد. ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
Range
عملگر پرس و جوی Range، یک توالی از مقادیر صحیح متوالی را برای ما ایجاد میکند. اولین پارامتر این عملگر عنصر آغاز کننده توالی است و دومین پارامتر این عملگر تعداد کل عناصر توالی تولید شده، با احتساب عنصر اول خواهد بود.
مثال:
IEnumerable<int> fiveToTen = Enumerable.Range(5,6); foreach (var num in fiveToTen) { Console.WriteLine(num); }
5 6 7 8 9 10
پیاده سازی توسط عبارتهای جستجو
معادل عملگر Range، کلمه کلیدی در عبارتهای جستجو وجود ندارد. ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
Repeat
عملگر پرس و جوی Repeat یک عدد را به تعداد بار مشخصی در توالی خروجی تکرار میکند.
مثال:
IEnumerable<int> fiveToTen = Enumerable.Repeat(42, 6); foreach (var num in fiveToTen) { Console.WriteLine(num); }
42 42 42 42 42 42
معادل عملگر Repeat، کلمه کلیدی در عبارتهای جستجو وجود ندارد. ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگرهای کمی (Quantifier Operators)
عملگرهای Quantifier یک توالی ورودی را گرفته، آن را ارزیابی کرده و یک مقدار منطقی را باز میگردانند.
عملگر Contains
عملگر Contains عناصر یک توالی را ارزیابی میکند و در صورتیکه مقدار مورد نظر ما در توالی وجود داشته باشد، ارزش True باز میگرداند.
مثال:
int[] nums = {1, 2, 3}; bool isTowThere = nums.Contains(2); bool isFiveThere = nums.Contains(5); Console.WriteLine(isTowThere); Console.WriteLine(isFiveThere);
True False
پیاده سازی توسط عبارتهای جستجو
معادل عملگر Contains، کلمه کلیدی در عبارتهای جستجو وجود ندارد. ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر Any
عملگر Any دو امضاء مختلف را دارد:
1- اولین امضاء: در صورتیکه توالی شامل حداقل یک عنصر باشد، ارزش True بازگردانده میشود.
2- دومین امضاء: یک عبارت پیش بینی را قبول میکند. در صورتیکه حداقل یکی از عناصر توالی، عبارت پیش بینی را تامین کند، ارزش صحیح باز گردانده میشود.
مثال: بررسی امضاء اول عملگر Any
int[] nums = { 1, 2, 3 }; IEnumerable<int> noNums = Enumerable.Empty<int>(); Console.WriteLine(nums.Any()); Console.WriteLine(noNums.Any());
True False
int[] nums = { 1, 2, 3 }; bool areAnyEvenNumbers = nums.Any(x => x % 2 == 0); Console.WriteLine(areAnyEvenNumbers);
True
پیاده سازی توسط عبارتهای جستجو
معادل عملگر Any، کلمه کلیدی در عبارتهای جستجو وجود ندارد. ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر All
عملگر پرس و جوی All، یک عبارت پیش بینی را دریافت میکند و عناصر توالی ورودی را بر مبنای آن ارزیابی میکند تا مشخص شود همه عناصر، شرط پیش بینی را تامین میکنند.
در کد زیر بررسی میکنیم که آیا همه عناصر توالی مواد غذایی، جزء مواد غذایی کم چرب میباشند یا خیر .
Ingredient[] ingredients = { new Ingredient { Name = "Sugar", Calories = 500 }, new Ingredient { Name = "Egg", Calories = 100 }, new Ingredient { Name = "Milk", Calories = 150 }, new Ingredient { Name = "Flour", Calories = 50 }, new Ingredient { Name = "Butter", Calories = 400 } }; bool isLowFatRecipe = ingredients.All(x => x.Calories < 200); Console.WriteLine(isLowFatRecipe);
False
نکته : عملگر All به محض پیدا کردن عنصری که شرط مشخص شده را نقض کند، ارزش False را باز میگرداند و ادامه بررسی عناصر باقی مانده را متوقف میکند.
پیاده سازی توسط عبارتهای جستجو
معادل عملگر Any، کلمه کلیدی در عبارتهای جستجو وجود ندارد. ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر SequenceEqual
عملگر SequenceEqual دو توالی را با هم مقایسه کرده و در صورتیکه عناصر هر دو توالی برابر و ترتیب قرار گیری آنها نیز یکسان باشند، ارزش True باز گردانده میشود.
مثال:
IEnumerable<int> sequence1 = new[] {1, 2, 3}; IEnumerable<int> sequence2 = new[] { 1, 2, 3 }; bool isSeqEqual = sequence1.SequenceEqual(sequence2); Console.WriteLine(isSeqEqual);
True
در صورتی که دو توالی عناصر یکسانی داشته باشند، ولی ترتیب قرار گیری عناصر با هم یکسان نباشند، عملگر ارزش False را باز میگرداند.
مثال :
IEnumerable<int> sequence1 = new[] { 1, 2, 3 }; IEnumerable<int> sequence2 = new[] { 3, 2, 1 }; bool isSeqEqual = sequence1.SequenceEqual(sequence2); Console.WriteLine(isSeqEqual);
False
معادل عملگر SequenceEqual، کلمه کلیدی در عبارتهای جستجو وجود ندارد. ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگرهای تجمیع/تجمعی Aggregate Operators
عملگرهای Aggregate یک توالی ورودی را دریافت و یک مقدار عددی (Scalar Value) را باز میگردانند. مقدار بازگردانده شده، حاصل یک عملیات محاسباتی میباشد.
لیستی از عملگرهای تجمیع ( Aggregate Operators ):
• Count
• LongCount
• Sum
• Min
• Max
• Average
• Aggregate
عملگر Count
عملگر Count، تعداد عناصر توالی ورودی را باز میگرداند. عملگر Count، دو امضاء مختلف دارد. یکی از این امضاءها یک عبارت پیش بینی را میپذیرد.
کد زیر، امضاء اول عملگر Count را نشان میدهد:
int[] nums = { 1, 2, 3 }; int numberOfElements = nums.Count(); Console.WriteLine(numberOfElements);
3
وقتی عبارت پیش بینی بکار گرفته میشود، عملگر Count تنها عناصری را که شرط را تامین کنند، شمارش میکند.
در کد زیر عملگر Count، همه عناصر زوج توالی ورودی را شمارش میکند:
int[] nums = { 1, 2, 3 }; int numberOfEvenElements = nums.Count(x => x % 2 == 0); Console.WriteLine(numberOfEvenElements);
1
پیاده سازی توسط عبارتهای جستجو
معادل عملگر Count ، کلمهی کلیدی در عبارتهای جستجو وجود ندارد. ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر LongCount
این عملگر مثل عملگر Count عمل میکند، اما با این تفاوت که خروجی آن به جای نوع int از نوع long میباشد. این عملگر برای شمارش توالیهای ورودی بسیار بزرگ مورد استفاده قرار میگیرد.
پیاده سازی توسط عبارتهای جستجو
معادل عملگر LongCount، کلمه کلیدی در عبارتهای جستجو وجود ندارد. ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر Sum
این عملگر مجموع تمامی عناصر یک توالی را باز میگرداند.
در کد زیر جمع عناصر یک توالی از نوع int را مشاهده میکنید:
int[] nums = { 1, 2, 3 }; int total = nums.Sum(); Console.WriteLine(total);
6
عملگر Sum میتواند بر روی توالیهایی از نوع <IEnumerable<T و بر روی اعضای عددی آنها اعمال شود.
مثال:
Ingredient[] ingredients = { new Ingredient { Name = "Sugar", Calories = 500 }, new Ingredient { Name = "Egg", Calories = 100 }, new Ingredient { Name = "Milk", Calories = 150 }, new Ingredient { Name = "Flour", Calories = 50 }, new Ingredient { Name = "Butter", Calories = 400 } }; int totalCalories = ingredients.Sum(x => x.Calories); Console.WriteLine(totalCalories);
1200
پیاده سازی توسط عبارتهای جستجو
معادل عملگر Sum، کلمه کلیدی در عبارتهای جستجو وجود ندارد. ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر Average
این عملگر میانگین عناصر توالیهای عددی را محاسبه میکند.
مثال:
int[] nums = { 1, 2, 3 }; var avg = nums.Average(); Console.WriteLine(avg);
2
همانطور که در کد بالا مشاهده میکنید، نوع متغیر avg صراحتا مشخص نشده و از نوع var استفاده شده است. تابع average بر اساس توالی ورودی، انواع مختلفی از نوع دادههای عددی را به خروجی ارسال میکند (double,float,decimal).
همانند عملگر Sum، عملگر Average میتواند بر روی اعضای عددی توالیهایی که از نوع<IEnumarable<T هستند، اعمال شود.
مثال:
Ingredient[] ingredients = { new Ingredient { Name = "Sugar", Calories = 500 }, new Ingredient { Name = "Egg", Calories = 100 }, new Ingredient { Name = "Milk", Calories = 150 }, new Ingredient { Name = "Flour", Calories = 50 }, new Ingredient { Name = "Butter", Calories = 400 } }; var avgCalories = ingredients.Average(x => x.Calories); Console.WriteLine(avgCalories);
240
پیاده سازی توسط عبارتهای جستجو
معادل عملگر Average، کلمه کلیدی در عبارتهای جستجو وجود ندارد. ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر Min
عملگر Min کوچکترین عنصر توالی را باز میگرداند.
مثال:
int[] nums = { 3, 2, 1 }; var smallest = nums.Min(); Console.WriteLine(smallest);
1
مثال:
Ingredient[] ingredients = { new Ingredient { Name = "Sugar", Calories = 500 }, new Ingredient { Name = "Egg", Calories = 100 }, new Ingredient { Name = "Milk", Calories = 150 }, new Ingredient { Name = "Flour", Calories = 50 }, new Ingredient { Name = "Butter", Calories = 400 } }; var smallestCalories = ingredients.Min(x => x.Calories); Console.WriteLine(smallestCalories);
پیاده سازی توسط عبارتهای جستجو
معادل عملگر Min ، کلمه کلیدی در عبارتهای جستجو وجود ندارد.ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
عملگر Max
عملگر Max بزرگترین عنصر توالی را باز میگرداند.
مثال:
int[] nums = { 1 ,3, 2 }; var largest = nums.Max(); Console.WriteLine(largest);
3
پیاده سازی توسط عبارتهای جستجو
معادل عملگر Max، کلمه کلیدی در عبارتهای جستجو وجود ندارد. ترکیب دو روش میتواند خروجی دلخواه را تولید کند.
Aggregate
عملگرهای تجمعی که تا اینجا معرفی شدند، تنها یک کار را انجام میدادند. اما عملگر Aggregate امکان تعریف یک پرس و جوی تجمیع سفارشی و پیشرفتهتر را که بر روی توالی ورودی اعمال میشود نیز مهیا میکند.
عملگر Aggregate دو نسخه دارد:
1- نسخهای که اجازه استفاده از یک عدد را به عنوان مقدار Seed، به ما میدهد (مقدار آغازین یا Seed).
2- نسخهای که از عنصر ابتدایی توالی به عنوان مقدار Seed استفاده میکند.
هر دو نسخه این عملگر به یک تابع انباره (accumulator function) جهت نگهداری نتیجه نیاز دارند.
کد زیر شبیه سازی عملگر Sum توسط عملگر Aggregate میباشد:
int[] nums = {1, 2, 3}; var result = nums.Aggregate(0, (currentElement, runningTotal) => runningTotal + currentElement); Console.WriteLine(result);
6
کد زیر شبیه سازی عملیات فاکتوریل را با در نظر گرفتن عنصر اول توالی، به عنوان مقدار Seed نشان میدهد:
int[] nums = { 1, 2, 3 ,4,5}; var result = nums.Aggregate((runningProduct, nextfactor) => runningProduct * nextfactor); Console.WriteLine(result);
120
پیاده سازی توسط عبارتهای جستجو
معادل عملگر Aggregate، کلمه کلیدی در عبارتهای جستجو وجود ندارد. ترکیب دو روش میتواند خروجی دلخواه را تولید کند.