Lambda İfadeleri (Lambda Expressions)

Benzer belgeler
HSancak Nesne Tabanlı Programlama I Ders Notları

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

11- FONKSİYONLAR (FUNCTIONS)

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

LINQ (Temel Kavramlar)

DÖNGÜLER (LOOPS) while(), do-while(), for(), foreach()

C# Yazım Kuralları ERCİYES. Ü. BİLGİSAYAR M. COMPUTER PROGRAMMING II 1 FEHİM KÖYLÜ

Yeni bir proje açarken File New - Web Site diyoruz. Gelen ekranda Visual Basic veya C# seçilebilir. Biz ders kapsamında C# programlama dilini seçtik.

C# Console Uygulamaları ifelse Yapıları 2

Sunum İçeriği. Programlamaya Giriş

ALGORİTMA VE PROGRAMLAMA I

5.HAFTA. Sınıf ve Nesne Kavramı, Metot Oluşturma, Kurucu Metot, this Deyimi

ALGORİTMA VE PROGRAMLAMA I

Göstericiler (Pointers)

Java 2 Standart Edition SDK Kurulum ve Java ya Giriş

if (ad == "Sabri") Console.WriteLine("Merhaba Sabri. Ne zamandır gözükmüyodun...");

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler

Nesne Yönelimli Programlama

public static int Toplam int x, int y

NESNEYE YÖNELİK PROGRAMLAMA

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

C++ Operatörler (Operators)

BASİT C PROGRAMLARI Öğr.Gör.Dr. Mahmut YALÇIN

Internet Programming II. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

C# Metotlar ve Metot Tanımlama

Diziler (Arrays) Çok Boyutlu Diziler

Örnek: İki fonksiyondan oluşan bir program. Fonksiyon Tanımı

Dr. Fatih AY Tel: fatihay@fatihay.net

Nesneye Dayalı Programlama

İNÖNÜ ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ 2. SINIF 1. DÖNEM VERİ YAPILARI DERSİ LABORATUAR ÖDEVİ

Javascript. 1) Notepad++ aşağıdaki kodları yazıp deneme.html olarak kaydedelim. 2) Biraz önceki sayfa sadece html kodların içeriyordu.

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-12 Fonksiyonlar. Yrd. Doç. Dr. Ümit ATİLA

Programlama Dillerinde Kullanılan Veri Tipleri

Bir dizinin boyutları sabittir ve kullanılmadan önce belirlenmelidir. Dizi boyutunu belirlemek için başka bir değişkende kullanabilirsiniz.

Akış Konrol Mekanizmaları

/*int sayi1, sayi2,toplam=0;

C++ Dersi: Nesne Tabanlı Programlama

Toplama işlemi için bir ikili operatör olan artı işareti aynı zamanda tekli operatör olarak da kullanılabilir.

MAK 1005 Bilgisayar Programlamaya Giriş. Fonksiyonlar. Prof. Dr. Necmettin Kaya

BİL-141 Bilgisayar Programlama I (Java)

HSancak Nesne Tabanlı Programlama I Ders Notları

Görsel Programlama 1

Programlama Dilleri 3

Hafta 13 Fonksiyonlar

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

J A V A D A P R O G R A M D E N E T İ M İ V E O P E R A T Ö R L E R

GENETİK ALGORİTMA GEZGİN SATICI ÖDEVİ

Nesne Tabanlı Programlama

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

HSancak Nesne Tabanlı Programlama I Ders Notları

C de Detaylı Üs Alma Programı. C# Dilinde Metot Tanımlama ve Yazdırma

Java da İşleçler, Ders #3 (4 Kasım 2009)

YAPILAR BİRLİKLER SAYMA SABİTLERİ/KÜMELERİ. 3. Hafta

OPERATÖRLER Alıştırmalar

Java String İşlemleri

JAVADA DİZİ İŞLEMLERİ

İçerik. Java da İşleçler, İşleçler. Aritmetik İşleçler - 1. Aritmetik İşleçler - 2. Geçen ders: Bu ders: BS-515 Nesneye Yönelik Programlama

HSancak Nesne Tabanlı Programlama I Ders Notları

Nesne Tabanlı Programlama

Programlama Dilleri III 1

Dekleratif Programlama. Örnek : Aile Ağacı. SWI-Prolog. Prolog Dekleratif programlama dili

Java da Program Denetimi ve Operatörler. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 2 1

KARAR YAPILARI. Acaba hangi yöne gitmeliyim? Oturduğun yerden kalkıp, kapıya varana kadar kaç kez karar verdiniz biliyor musunuz?

D İ Z İ L E R A R R A Y S

EĞİTİM : LINQ to SQL. Bölüm : LINQ e Genel Bakış. Konu : LINQ Nedir? Page 1 of 25

Sınıflar ve Yapılar Arasındaki Farklılıklar. Değer ve Referans Türde Olan Aktarımlar

C++ Dersi: Nesne Tabanlı Programlama

FONKSİYONLAR. Gerçek hayattaki problemlerin çözümü için geliştirilen programlar çok büyük boyutlardadır.

PROGRAMLAMAYA GİRİŞ FONKSİYONLAR

while(), do-while(), for() M.İLKUÇAR 2010 MAKU-MYO

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD

Operator Aşırı Yükleme (Operator OverLoading)

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

BİLGİSAYAR MÜHENDİSLİĞİ ALGORİTMA VE PROGRAMLAMA II 2.HAFTA SWİTCH (CASE), SAYAÇLAR, DÖNGÜLER,

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

Internet Programming II

C#.Net & Linq (Language Integrated Query)

C++ Dersi: Nesne Tabanlı Programlama

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

C# Çalışma Örnekleri

INPUTBOX KULLANIMI. Komut Düğmesine uygulanan algoritma örneği

Dizi ( Array ) ve Dizgi ( String )

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

Özyineleme (Recursion)

Şablon Türler (Generics)

elemanlarının gezilmesine yönelik bir örnek sunulmuştur, inceleyiniz.

Sınav Dağılım & IMKB Endeks

ELN1001 BİLGİSAYAR PROGRAMLAMA I

Öğr. Gör. Serkan AKSU 1

Karşılaştırma İşlemleri ve Koşullu İfadeler

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

Mühendislik Fakültesi Elektrik-Elektronik Mühendisliği C Programlama 3. Bölüm Veri Tipleri ve Değişkenler

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

ALGORİTMA VE PROGRAMLAMA II

BM102 BİLGİSAYAR PROGRAMLAMA II LABORATUVAR UYGULAMALARI. 3Hafta

GENEL GĐRĐŞ-ÇIKIŞ FONKSĐYONLARI. ENF102 Jeoloji 1. #include <stdio.h> printf Fonksiyonu ÖRNEK. printf

7.1- C#.net Giriş Çıkış İşlemleri ve Visual Studio. M.İLKUÇAR - 1

Ders Tanıtım Sunumu. Internet Programming II. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı. Öğr. Gör. Murat KEÇECİOĞLU 1

Nesne Tabanlı Programlama Dersi Edirne Kız Teknik ve Meslek Lisesi

Transkript:

Lambda İfadeleri (Lambda Expressions) Lambda İfadeleri, değişkenlere değer atamak için kullanılan sadeleştirilmiş anonim (isimsiz) fonksiyonlardır. Bu fonksiyonlar matematikteki ve bilgisayar bilimlerindeki Lambda Calculus'un C# ve Visual Basic uygulamasıdır. Lambda İfadeleri kullanarak parametre geçilebilen ve değer döndüren isimsiz yerel fonksiyonlar oluşturabilirsiniz. Bu ifadeler genelde basit işlemleri bildirmekte kullanılabilir ve LINQ sorgularının yazımında çok işe yararlar. LINQ konusunu bu yazıdan sonra incelemenizi tavsiye ederiz. Örnek : n => n * n Bir Lambda İfadesi oluşturmak örnekte olduğu gibi eğer varsa sol tarafta parametre bildirimini, lambda operatöründen (=>) sonra ifadeyi veya kod bloğunu sağ tarafa yazın. Üstteki ifadenin anlamı şudur; Bir parametre al ve bu parametreyi n kabul et (soldaki n), n'yi kendisiyle çarpıp sonucu döndür (sağdaki n * n ). Bu fonksiyon eğer anonim (isimsiz) fonksiyonlara yabancı iseniz ismi (kare) olması ve tip bildirimleri (int) dışında aşağıdakiyle aynıdır. int kare(int n) Aynı işlemi yapan fonksiyon anonim olarak da şu şekilde tanımlanır; delegate (int n) Eğer bu tanımlamadan delegate ifadesini çıkarırsanız bir Lambda İfadesi elde eder ve kullanabilirsiniz. Artık bir Lambda İfadesi olan isimsiz fonksiyonun yeni hali... (int n) şeklinde olacaktır.

Süslü parantezleri lambda işlecine dönüştürürsek; (int n) => biçiminde hala geçerli olan bir Lambda İfadesi elde ederiz. n * n tek bir ifade olduğundan noktalı virgülü ve return ifadesini kaldırırsak; (int n) => n * n biçimi kalır ve geçerli bir Lambda İfadesidir. n parametresinin tipi biz vermesek bile derleyici tarafından uygun biçimde tanımlanacağından parametrenin türünü belirleyen int ifadesini de kaldırabiliriz. Bu durumda fonksiyon; (n) => n * n olur. Artık tip kullanmadığımıza ve tek parametremiz olduğuna göre baştaki parantezler de gereksizdir. Ve geriye kalır; n => n * n Görüldüğü gibi isimsiz fonksiyonlarla Lambda İfadeleri aynıdır. Şimdiye kadar gördümüz kadarıyla aralarındaki tek fark lambda fonksiyonlarının tek satır halinde olmasıdır. Tek satır halindeki Lambda İfadelerine Expression Lambdas (İfade Lambdaları) denir. İfadenin sağ tarafında süslü parantezler ve sonunda da noktalı virgül kullanılarak çok satırlı bir Lambda İfadesi de yazılabilir. Böyle yazılan Lambda İfadelerine Statement Lambdas (Komut Lambdaları) denir. n => string s = "Merhaba " + n; Console.WriteLine(s); ; Lambda İfadelerinde parametre zorunlu değildir. Aşağıdaki de geçerli bir ifadedir. () => birfonksiyon() bildiririz. Parametreler bir parametreden fazla olabilir. Bu durumda parametreleri parantez içinde (a, b) => a > b (...)

Yukarıda verilen Lambda İfadelerini program koduna eklerseniz "Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement." (...) şeklinde bir uyarı görürsünüz. Yani bu ifadeleri tek başına yazmanın bir anlamı yoktur ve çalışacak bir şey değildir. Şimdi bunların nasıl kulanıldıklarından bahsedelim. Başlangıçta da belirtildiği gibi Lambda İfadelerinin en fazla işe yaradığı yer LINQ sorgularıdır. LINQ bir kaç cümleyle anlatılamayacağından ve bilmeyenler için şu anda kafa karıştırıcı olacağından dolayı ayrıca incelenmelidir. Burada sadece LINQ'in iki kullanım şeklinden biri olan yöntem sözdizimi (method syntax) kullanılarak yazılan alttaki örnekten yararlanabiliriz (...). using System; using System.Collections.Generic; using System.Linq; namespace Console_Lambdas1 class Program static void Main(string[] args) // Tüm rakamları kullanarak bir dizi tanımla. int[] tumrakamlar = new int[] 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ; // Tek rakamları seç ve yeni bir koleksiyona kopyala. IEnumerable<int> tekrakamlar = tumrakamlar.where(x => x % 2 == 1); Console.WriteLine("Tek rakamlar :"); // tekrakamlar dizisinin elemanlarını yaz. foreach (int rakam in tekrakamlar) Console.WriteLine(rakam); Console.ReadKey(); Örnekte görüldüğü gibi LinQ'in yöntem sözdizimi (.Where(...) bölümü) kullanılmış, Where seçme yöntemine bir Lambda İfadesi parametre olarak gönderilmiştir. Program, tüm rakamların dizisinden tek olan rakamları seçer ve ekrana yazar. Örnekteki Lambda İfadesi x isimli bir parametre alır, x mod 2 işlemini çalıştırarak sonucun 1'e eşit olup olmadığını döndürür. Where seçici yöntemi, IEnumerable (Türkçesi sayılabilir) arayüzünü veya IEnumerable<T> genelleyici (generic) arayüzünü uygulayan tüm sınıflarda kullanılan, sınıfın (...) elemanlarını tek tek gezip kendisine gönderilen Lambda İfadesi uygulandığında "true"

sonucu döndüren elemanları seçerek sonuç olarak yine IEnumerable türünden bir sınıfa ekler ve bu sınıfı döndürür. LINQ dışında Lambda İfadeleri kendileri de isimsiz fonksiyonlar olduklarından fonksiyonları temsil etmede kullanılan delege (delegate) tanımlamalarında kullanılırlar. Aşağıdaki örneği inceleyin... using System; using System.Collections.Generic; using System.Linq; namespace Console_Lambdas2 class Program // Tamsayı döndüren ve parametre olarak 2 adet tamsayı alan bir delege tipi tanımla. delegate int TamsayiIslevi(int sayi1, int sayi2); static void Main(string[] args) // tamsayiislevi delegesi türünden bir delege değişken // tanımla (= işaretinin solundaki bölüm) ve delegeye // Lambda İfadesi ile tanımlanmış olan bir isimsiz // fonksiyonu ata (= işaretinin sağındaki bölüm). TamsayiIslevi tsitopla = (x, y) => x + y; // Aynı delege tipini kullanarak 2. bir isimsiz // fonksiyon tanımla ve bir delege değişkene ata. TamsayiIslevi tsicikar = (x, y) => x - y; // Delege değişkenleri kullanarak referansı oldukları // fonksiyonları çalıştır ve çıktıya yaz. Console.WriteLine(tsiTopla(5, 2)); Console.WriteLine(tsiCikar(5, 2)); Console.ReadKey(); Delegeler (Türkçesi temsilciler), fonksiyonların referansı (...) olarak kullanılırlar. Örnekte "delegate" ifadesi kullanılarak bir delege tipi tanımlanmıştır. Main yordamında ise bu tip delege türünden delege değişkenler tanımlanarak Lambda İfadesi yöntemi ile anonim fonksiyonlar delege değişkenlere atanmıştır. Bundan sonra bu delege değişkenler, kendilerine atanan anonim fonksiyonlara referans olmuştur. Sonraki satırlarda ise bu referanslar ve uygun parametreler ( tsitopla(5, 2) gibi) kullanılarak delegelerin (örneğin tsitopla'nın) referansı olduğu fonksiyonlar (örneğin (x, y) => x + y ) çalıştırılmıştır.

Delegelerin çok faydalanıldıkları bir konu da olaylardır. Aynı delegenin bir fonksiyondan fazlasına referans olabilmesi (...) ve birbirine benzer türde bir çok olay bulunması sebebiyle olay kullanımında çok işe yararlar. Bu konu mutlaka incelenmelidir. Tek satırlı lambda ifadeleri (Expression Lambdas), birer ifade ağacıdır (Expression Tree) ve bundan dolayı bir lamda ifadesini çözümleyebilir veya oluşturabiliriz. Hatta C# ile çok satırlı ifadeleri de Expression Sınıfı kullanarak oluşturabilir ve çözümleyebiliriz. İfadeleri oluşturmak ve çözümlemek sıkça kullanılabilecek bir işlem olmasa da ifade ağaçları ve Expression Sınıfının kullanımını öğrenerek programlama bilginizi bir adım daha ileri götürmek için İfade Ağaçları (Expression Trees) ve Expression Sınıfı yazımı okumanızı tavsiye ederim.