using System;
delegate int Incr(int v);
namespace Lambda
{
delegate bool IsEven(int v);
class SimpleLambdaDemo
{
static void Main()
{
Incr incr = count => count + 2;
Console.WriteLine("Lambda ifodasida incr dan foydalanish : ");
int x = -10;
while(x <= 0)
{
Console.Write(x + " ");
x = incr(x);
}
Console.ReadKey();
}
}
}
Natija quyidagicha:
using System;
delegate int Incr(int v);
namespace Lambda
{
delegate bool IsEven(int v);
class SimpleLambdaDemo
{
static void Main()
{
IsEven isEven = n => n % 2 == 0;
Console.WriteLine("Lambda ifodasida IsEven dan foydalanish : ");
for(int i=1; i <= 10; i++)
if(isEven(i)) Console.Write(i + " ");
Console.ReadKey();
}
}
}
Yuqoridagi birinchi dasturda, incr delegatsiyasining namunasiga yagona lambda iborasi berilgan, bu hisoblash natijasi parametrning qiymatini 2 ga oshiradi. Ushbu ifoda Incr vakiliga tayinlanishi mumkin, chunki u ushbu vakilning deklaratsiyasiga mos keladi.
Ikkinchi dasturda isEven delegatsiyasiga (agar unga berilgan argument mos bo'lsa) mantiqiylikni qaytaradigan ifoda beriladi, aks holda mantiqiy ifoda yolg’on qiymat qabul qiladi. Shuning uchun, bu lambda ifodasi isEven deklaratsiyasiga mos keladi.
Yuqoridagilar bilan bog'liq holda, oqilona savol tug'iladi: kompilyator lambda ifodasida ishlatiladigan ma'lumot turini qanday biladi, masalan, vakilga berilgan lambda ifodasidagi hisoblash parametrining int turi haqida ma'lumotni qanday oladi?
Bu savolga javob quyidagicha: kompilyator parametr turi va ifoda vakili turiga qarab baho beradi va natijasining turi to'g'risida xulosa chiqaradi. Shuning uchun, lambda ifodasining parametrlari vakilning qaytish qiymatiga va qaytarilish qiymati parametrlarga mos kelishi kerak.
Demak, siz lambda ifoda parametr turini aniq ko'rsatishingiz kerak. Buning uchun ma'lumotlar turiga ma'lum bir nomni kiritish kifoya. Misol sifatida, quyida delegatni e'lon qilishning yana bir usuli mavjud:
Incr incr = (int x) => x + 2;
Ko'rib turganingizdek, o’zgaruvchi endi aniq parametr sifatida e'lon qilingan. Qavslar qo'llanilishiga e'tibor bering. Endi ular kerak! (Qavslar faqat bitta parametr ko'rsatilgan bo'lsa va uning turi aniq ko'rsatilmagan bo'lsa foydalanilmasligi mumkin.)
Yuqoridagi dasturlardagi ikkala lambda ifodalarida bitta parametr ishlatilgan, ammo umuman lambda ifodalari nolni o'z ichiga olgan har qanday parametrlarga ega bo'lishi mumkin. Agar lambda ifodasida bir nechta parametr ishlatilsa, ular qavs ichiga o'ralgan bo'lishi kerak. Quyida qiymat ma'lum bir oraliqda ekanligini aniqlash uchun lambda ifodasini ishlatishga misol keltirilgan.
(min, max, qiymat) =>qiymat >= min && qiymat <= max;
Va bu qanday qilib delegat turi ushbu lambda ifodasi bilan mos kelishi e'lon qilinadi.
delegate bool Oraliq(int min, int max, int qiymat);
Shuning uchun InRange delegatining namunasi quyidagicha yaratilishi mumkin.
Oraliq oraliq = (min, max, qiymat) => qiymat >= min && qiymat <= max;
Shundan so'ng, yagona lambda ifodasi quyida ko'rsatilgandek bajarilishi mumkin.
if(oraliq(1, 5, 3)) Console.WriteLine(
"3 soni 1 dan 5 gacha bo’lgan oraliqda.");
Do'stlaringiz bilan baham: |