3. Birlik lyambda-ifodalar
Bitta lyambda-ifoda qismi = > operator o'ng tomonida joylashgan, chap tomonida ko'rsatilgan parametr(yoki parametrlar bir qator)ga ta'sir qiladi. Bunday ifodani hisoblash natijasi lambda operatorining natijasi hisoblanadi.
Quyida bitta parametr qabul qiluvchi birlik lyambda-ifodasining umumiy shakli keltirilgan.
parametr = > ifoda
Agar siz bir nechta parametrlarni ko'rsatmoqchi bo'lsangiz, quyidagi shakl ishlatiladi.
(parametrlar_ro_yxati) => ifoda
Shunday qilib, ikkita yoki undan ko'p parametrlarni belgilash zarur bo'lganda, ular qavslar ichida yozilishi kerak. Agar ifoda parametrlarni talab qilmasa, bo'sh qavslardan foydalaniladi.
Quyida birlik lyambda-ifodasiga oddiy misol.
count => count + 2
Ushbu ifodada count parametri count + 2 ifodasi bilan ishlayotgan parametr sifatida xizmat qiladi. Natijada, count parametrining qiymati 2 ga oshadi. Bu yerda birlik lyambda-ifodasiga yana bir misol.
n => n % 2 == 0
Bunday holda, n parametrining qiymati juft bo`lsa true, aks holda false mantiqiy qiymatni qaytaradi.
Lyambda-ifodasi ikki bosqichda qo'llaniladi. Birinchi, lyambda-ifodasi bilan mos keladigan delegat tipini e`lon qilishda, keyin lyambda-ifodasi belgilangan delegatning nusxasi e'lon qilinadi. Shundan so'ng, lyambda-ifodasi delegatga murojaat qilganda hisoblab chiqiladi. Uning hisoblash natijasi qaytarish qiymati bo'ladi.
Quyidagi misol dasturi ikkita birlik lyambda-ifodasini qo'llashni namoyish etadi. Birinchidan, ushbu dasturda ikki tipdagi delegatlar e'lon qilinadi. Birinchisi, Incr, int tipda argument qabul qiladi va shu tipda natija qaytaradi. Ikkinchi delegat, IsEven, int tipida argument qabul qiladi, ammo bool tipida natija qaytaradi. Keyin bu delegatlarning nusxalari birlik lyambda-ifodalar bilan belgilanadi. Oxirida, lyambda-ifodalar delegatlarning tegishli nusxalari yordamida hisoblab chiqiladi.
// Ikkita birlik lyambda-ifodaning qo'llanilishi.
using System;
//int tipida argument qabul qiluvchi va int tipida natija
//qaytaradigan delegatni e'lon qilish.
delegate int Incr(int v) ;
//int tipida argument qabul qiluvchi va bool tipida natija
//qaytaradigan delegatni e'lon qilish.
delegate bool IsEven(int v) ;
class SimpleLambdaDemo {
static void Main() {
//Yaratilgan Incr delegati lyambda-ifodaga murojaat qilib
//parametri qiymatini 2ga oshiradi.
Incr incr = count => count + 2;
// Endi incr lyambda-ifodasini ishlatish.
Console.WriteLine("Использование лямбда-выражения incr: ");
int x = -10;
while(x <= 0) {
Console.Write(x + " ");
x = incr(x); // x qiymatini 2 ga oshirish
}
Console.WriteLine("\n");
// Lyambda-ifodaga murojaat qiluvchi parametri qiymati juft bo`lsa true, aks holda //false mantiqiy qiymat qaytaruvchi IsEven delegati nusxasini yaratish
IsEven isEven = n => n % 2 == 0;
// Endi isEven lyambda-ifodasini ishlatish.
Console.WriteLine("Использование лямбда-выражения isEven: ");
for(int i=l; i <= 10; i++)
if(isEven(i)) Console.WriteLine(i + " четное.");
}
}
Bu dasturning bajarilishi natijasi.
Использование лямбда-выражения incr:
-10 -8 -6 -4 -2 0
Использование лямбда-выражения isEven:
2 четное.
4 четное.
6 четное.
8 четное.
10 четное.
Ushbu dasturdagi e`lon satrlariga alohida e'tibor bering.
Incr incr = count => count +2;
IsEven isEven = n => n % 2 == 0;
E'lonning birinchi satrida incr delegatining nusxasi birlik lyambda-ifodasi bilan belgilangan, natijada count parametrining qiymati 2 ga oshirilib qaytariladi. Ushbu ifodani Incr delegatiga o`zlashtirish mumkin, chunki u ushbu delegatning e'loniga mos keladi. Incr delegatining nusxasiga murojaat qilinganda ko'rsatilgan argumentga lyambda-ifodani hisoblash natijasini qaytarish count parametri orqali uzatiladi. E'lonning ikkinchi satrida isEven delegati parametri qiymati juft bo`lsa true, aks holda false mantiqiy qiymat qaytariladi. Shunday qilib, bu lyambda-ifoda IsEven delegatining e'loniga mos keladi.
Yuqoridagilarga asosan, o`rinli savol tug'iladi: lyambda-ifodada ishlatiladigan ma'lumotlar tipi komplyatorga qanday ma'lum bo'ladi, misol uchun, incr delegatining nusxasiga tayinlangan lyambda-ifodadagi count parametrning int tipi haqidagi ma`lumot? Bu savolga shunday javob berish mumkin: komplyator parametr tipi va delegat tipiga ko'ra ifodani hisoblash natijasining tipi haqida xulosa chiqaradi. Shuning uchun lyambda-ifodalarining parametrlari va qaytariladigan qiymati delegatning parametrlari va qaytariladigan qiymati bilan mos bo'lishi kerak.
Ma'lumotlar tipi bo'yicha mantiqiy xulosaning barcha afzalligiga qaramasdan, ayrim hollarda lyambda-ifodasi parametrining tipini aniq ko'rsatish kerak. Buning uchun ma'lumot tipi uchun ma'lum bir nomni kiritish kifoya. Misol sifatida, incr delegatni e'lon qilishning yana bir usuli.
Incr incr = (int count) => count + 2;
Ko'rib turganingizdek, count endi aniq int tipli parametr sifatida e'lon qilinadi. Qavslardan foydalanishga ham e'tibor bering. Endi ular kerak. (Qavslarni faqat bitta parametr o'rnatilganda va uning tipi aniq ko'rsatilmaganda bekor qilinishi mumkin.) Avvalgi misolda lyambda-ifodalarida bitta parametr ishlatilgan, umuman olganda, lyambda-ifodalari har qanday parametrga ega bo'lishi mumkin, shu jumladan nolta ham. Lyambda-ifodada bir nechta parametrlardan foydalanilsasa, ular qavslar ichida yozilishi kerak. Quyida qiymat bilan chegaragan sohani aniqlash uchun lyambda-ifodani ishlatish misoli keltirilgan.
(low, high, val) => val >= low && val <= high;
Bu lyambda-ifoda bilan mos keladigan delegatning tipi quyidagicha e'lon qilinadi.
delegate bool InRange(int lower, int upper, int v);
Shunday qilib, InRange delegatining nusxasi quyidagicha yaratilishi mumkin.
InRange rangeOK = (low, high, val) => val >= low && val <= high;
Shundan so'ng, birlik lyambda-ifodasi quyida ko'rsatilganidek ishlatilishi mumkin.
if(rangeOK(l, 5, 3)) Console.WriteLine("Число 3 находится в пределах от 1 до 5.");
Oxirgi eslatma: tashqi o'zgaruvchilar lyambda-ifodalarda ham anonim metodlarda bo'lgani kabi ishlatilishi va olinishi mumkin.
Do'stlaringiz bilan baham: |