4. Blokli lyambda-ifodalar Yuqorida aytib o'tilganidek, lyambda-ifodalarining ikki turi mavjud. Ulardan birinchisi, avvalgi bobda ko'rib chiqilgan birlik lyambda-ifodasi. Bunday lyambda-ifoda tanasi faqat bitta ifodadan iborat. Ikkinchi tur - blokli lyambda-ifodalar hisoblanadi. Bunday lyambda-ifodalari turli operatsiyalarni bajarishni kengaytirish imkoniyatlar beradi, chunki uning tanasida bir nechta operatorlarni ko'rsatishga ruxsat beriladi. Misol uchun, blokli lyambda-ifodalarda takrorlash va if shart operatori, o'zgaruvchilar e'lon qilish va hokazolarda foydalanish mumkin. Blokli lyambda-ifodani yaratish qiyin emas. Buning uchun ifoda tanasini figurali qavslar orqali kiritish kifoya. Bir nechta operatorlardan foydalanish imkoniyatidan tashqari, blokli lyambda-ifoda ham yuqorida ko'rib chiqilgan birlik lyambda-ifodadan deyarli farq qilmaydi.
Quyida butun sonning faktorialini hisoblash va qaytarish uchun blokli lyambda-ifodalarsini qo'llash misoli keltirilgan.
// Blokli lyambda-ifodasini qo'llashni namoyishi. using System; // IntOp delegati int tipida bir argumentni qabul qiladi va //int tipida natija qaytaradi. delegate int IntOp(int end); class StatementLambdaDemo { static void Main() { // Blokli lyambda-ifodalarsi unga berilgan qiymatning faktorialini qaytaradi. IntOp fact = n => { int r = 1; for (int i=1; i <= n; i++) r = i * r; return r; }; Console.WriteLine("Факториал 3 равен " + fact(3)); Console.WriteLirie("Факториал 5 равен " + fact(5)); } } Ushbu kod bajarilganidan so`ng quyidagi natijalar olinadi.
Факториал 3 равен 6 Факториал 5 равен 120 Yuqoridagi misolda, blokli lyambda-ifodalar tanasida r o'zgaruvchini e'lon qilinishi, for takrorlash operatori va return operatori ishlatilishiga e'tibor bering. Bu elementlarning barchasini blokli lyambda-ifodalarsida qo`llashga to`liq ruxsat bor. Shu nuqtai nazardan, u anonim metodga juda o'xshaydi. Binobarin, ko'p anonim metodlar meros kodni yangilash paytida blokli lyambda-ifodalar aylanadi mumkin. Yana bir eslatma: blokli lyambda-ifodalar return operatori javob sifatida shunchaki lyambda-ifodasini qaytarishga olib keladi biroq, o'z ichiga olgan metodni qaytmasligi kerak.
Oxirida, blokli lyambda-ifodalarsini namoyish etadigan yana bir misolni ko'rib chiqaylik. Quyida ushbu bobning birinchi misolining bir ko`rinishi, satrlar bilan turli operatsiyalarni bajarish uchun avtonom metodlar o'rniga blokli lyambda-ifodalarini ishlatish uchun o'zgartirildi.
// Blokli lyambda-ifodalarini ishlatish uchun qayta ishlangan //delegatlarni qo'llashning birinchi misoli. using System; // Delegat tipini e'lon qilish delegate string StrMod(string s); class UseStatementLambdas { static void Main() { // Belgili satrlar bilan turli operatsiyalarni //bajaradigan lyambda-ifodalarga murojaat qilgan delegatlarni yaratish. // Probellarni chiziqlar bilan almashtirish. StrMod ReplaceSpaces = s => { Console.WriteLine("Замена пробелов дефисами."); return s.Replace(' ', '-'); }; // Probellarni o`chrish. StrMod RemoveSpaces = s => { string temp = ""; int i; Console.WriteLine("Удаление пробелов."); for(i=0; i < s.Length; i++) if (s[i] != ' ') temp += s[i] ; return temp; }; // Satrni teskarisiga o`girish. StrMod Reverse = s => { string temp = ""; int i, j; Console.WriteLine("Обращение строки."); for(j=0, i=s.Length-l; i >= 0; i--, j++) temp += s[i]; return temp; }; string str; // Delegatlar yordamida lyambda-ifodalarga murojaat qilish. StrMod strOp = ReplaceSpaces; str = strOp("Это простой тест."); Console.WriteLine("Результирующая строка: " + str); Console.WriteLine() ; strOp = RemoveSpaces; str = strOp("Это простой тест."); Console.WriteLine("Результирующая строка: " + str); Console.WriteLine() ; strOp = Reverse; str = strOp("Это простой тест."); Console.WriteLine("Результирующая строка: " + str); } } Ushbu misolning kodini bajarish natijasi delegatlarni qo'llashning birinchi misolida bo'lgani kabi bir xil bo'ladi.
Замена пробелов дефисами. Результирующая строка: Это-простой-тест. Удаление пробелов. Результирующая строка: Этопростойтест. Обращение строки. Результирующая строка: .тсет йотсорп отЭ Foydalanildi: 1. Герберт Шилдт. С# 4.0: полное руководство. Пер. с англ. — М.: ООО "И.Д. Вильяме", 2011.