LINQ - Ekspresi Lambda

Istilah 'ekspresi Lambda' mendapatkan namanya dari kalkulus 'lambda' yang pada gilirannya merupakan notasi matematika yang diterapkan untuk mendefinisikan fungsi. Ekspresi Lambda sebagai bagian yang dapat dieksekusi dari persamaan LINQ menerjemahkan logika dengan cara pada waktu proses sehingga dapat diteruskan ke sumber data dengan mudah. Namun, ekspresi lambda tidak hanya terbatas untuk menemukan aplikasi di LINQ saja.

Ekspresi ini diekspresikan oleh sintaks berikut -

(Input parameters) ⇒ Expression or statement block

Berikut adalah contoh ekspresi lambda -

y ⇒ y * y

Ekspresi di atas menetapkan parameter bernama y dan nilai y dikuadratkan. Namun, tidak mungkin mengeksekusi ekspresi lambda dalam formulir ini. Contoh ekspresi lambda di C # ditunjukkan di bawah ini.

C #

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lambdaexample {
   class Program {

      delegate int del(int i);
      static void Main(string[] args) {

         del myDelegate = y ⇒ y * y;
         int j = myDelegate(5);
         Console.WriteLine(j);
         Console.ReadLine();
      }
   }
}

VB

Module Module1
   Private Delegate Function del(ByVal i As Integer) As Integer
   
   Sub Main(ByVal args As String())
   
      Dim myDelegate As del = Function(y) y * y
      Dim j As Integer = myDelegate(5)
      Console.WriteLine(j)
      Console.ReadLine()
	  
   End Sub
   
End Module

Ketika kode C # atau VB di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

25

Ekspresi Lambda

Karena ekspresi dalam sintaks ekspresi lambda yang ditunjukkan di atas ada di sisi kanan, ini juga dikenal sebagai ekspresi lambda.

Async Lambdas

Ekspresi lambda yang dibuat dengan memasukkan pemrosesan asinkron dengan menggunakan kata kunci asinkron dikenal sebagai lambda asinkron. Di bawah ini adalah contoh lambda asinkron.

Func<Task<string>> getWordAsync = async()⇒ “hello”;

Lambda di Operator Kueri Standar

Ekspresi lambda dalam operator kueri dievaluasi dengan yang sama sesuai permintaan dan terus bekerja pada setiap elemen dalam urutan masukan dan bukan seluruh urutan. Pengembang diizinkan oleh ekspresi Lambda untuk memasukkan logikanya sendiri ke dalam operator kueri standar. Dalam contoh di bawah ini, pengembang telah menggunakan operator 'Di mana' untuk mendapatkan kembali nilai ganjil dari daftar yang diberikan dengan menggunakan ekspresi lambda.

C #

//Get the average of the odd Fibonacci numbers in the series... 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lambdaexample {
   class Program {     
      static void Main(string[] args) {
      
         int[] fibNum = { 1, 1, 2, 3, 5, 8, 13, 21, 34 };
         double averageValue = fibNum.Where(num ⇒ num % 2 == 1).Average();
         Console.WriteLine(averageValue);
         Console.ReadLine();
      }
   }
}

VB

Module Module1

   Sub Main()
   
      Dim fibNum As Integer() = {1, 1, 2, 3, 5, 8, 13, 21, 34}
      Dim averageValue As Double = fibNum.Where(Function(num) num Mod 2 = 1).Average()
	  
      Console.WriteLine(averageValue)
      Console.ReadLine()
	  
   End Sub
   
End Module

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

7.33333333333333

Ketik Inferensi di Lambda

Dalam C #, inferensi tipe digunakan dengan nyaman dalam berbagai situasi dan itu juga tanpa menentukan tipe secara eksplisit. Namun dalam kasus ekspresi lambda, jenis inferensi hanya akan berfungsi jika setiap jenis telah ditentukan karena kompilator harus dipenuhi. Mari pertimbangkan contoh berikut.

delegate int Transformer (int i);

Di sini compiler menggunakan tipe inferensi untuk menggambarkan fakta bahwa x adalah integer dan ini dilakukan dengan memeriksa tipe parameter dari Transformer.

Cakupan Variabel dalam Ekspresi Lambda

Ada beberapa aturan saat menggunakan cakupan variabel dalam ekspresi lambda seperti variabel yang dimulai dalam ekspresi lambda tidak dimaksudkan untuk terlihat di metode luar. Ada juga aturan bahwa variabel yang ditangkap tidak boleh sampah dikumpulkan kecuali delegasi yang mereferensikan hal yang sama memenuhi syarat untuk tindakan pengumpulan sampah. Selain itu, ada aturan yang melarang pernyataan kembali dalam ekspresi lambda menyebabkan kembalinya metode penutup.

Berikut adalah contoh untuk menunjukkan ruang lingkup variabel dalam ekspresi lambda.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lambdaexample {
   class Program {
      delegate bool D();
      delegate bool D2(int i);

      class Test {
         D del;
         D2 del2;
			
         public void TestMethod(int input) {
            int j = 0;
            // Initialize the delegates with lambda expressions.
            // Note access to 2 outer variables.
            // del will be invoked within this method.
            del = () ⇒ { j = 10; return j > input; };

            // del2 will be invoked after TestMethod goes out of scope.
            del2 = (x) ⇒ { return x == j; };

            // Demonstrate value of j:            
            // The delegate has not been invoked yet.
            Console.WriteLine("j = {0}", j);        // Invoke the delegate.
            bool boolResult = del();
           
            Console.WriteLine("j = {0}. b = {1}", j, boolResult);
         }

         static void Main() {
            Test test = new Test();
            test.TestMethod(5);

            // Prove that del2 still has a copy of
            // local variable j from TestMethod.
            bool result = test.del2(10);
           
            Console.WriteLine(result);

            Console.ReadKey();
         }
      }
   }
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

j = 0
j = 10. b = True
True

Pohon Ekspresi

Ekspresi lambda digunakan dalam Expression Treekonstruksi secara ekstensif. Pohon ekspresi memberikan kode dalam struktur data yang menyerupai pohon di mana setiap node merupakan ekspresi seperti pemanggilan metode atau dapat berupa operasi biner seperti x <y. Di bawah ini adalah contoh penggunaan ekspresi lambda untuk membangun pohon ekspresi.

Pernyataan Lambda

Ada juga statement lambdasterdiri dari dua atau tiga pernyataan, tetapi tidak digunakan dalam konstruksi pohon ekspresi. Pernyataan kembali harus ditulis dalam pernyataan lambda.

Sintaks pernyataan lambda

(params)⇒ {statements}

Contoh pernyataan lambda

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;

namespace lambdaexample {
   class Program {
      static void Main(string[] args) {
         int[] source = new[] { 3, 8, 4, 6, 1, 7, 9, 2, 4, 8 };

         foreach (int i in source.Where(x ⇒ 
            {
               if (x <= 3)
                  return true;
               else if (x >= 7)
                  return true;
               return false;
            }
         ))
        Console.WriteLine(i);
        Console.ReadLine();
      }
   }
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

3
8
1
7
9
2
8

Lambdas digunakan sebagai argumen dalam kueri LINQ berdasarkan metode dan tidak pernah diizinkan memiliki tempat di sisi kiri operator seperti is atau asseperti metode anonim. Meskipun, ekspresi Lambda sangat mirip dengan metode anonim, ini sama sekali tidak dibatasi untuk digunakan sebagai delegasi saja.

Poin yang perlu diingat saat menggunakan ekspresi lambda

  • Ekspresi lambda dapat mengembalikan nilai dan mungkin memiliki parameter.

  • Parameter dapat didefinisikan dalam berbagai cara dengan ekspresi lambda.

  • Jika ada pernyataan tunggal dalam ekspresi lambda, tidak perlu tanda kurung kurawal sedangkan jika ada beberapa pernyataan, tanda kurung kurawal serta nilai kembalian penting untuk ditulis.

  • Dengan ekspresi lambda, dimungkinkan untuk mengakses variabel yang ada di luar blok ekspresi lambda dengan fitur yang dikenal sebagai closure. Penggunaan penutup harus dilakukan dengan hati-hati untuk menghindari masalah.

  • Tidak mungkin menjalankan kode yang tidak aman di dalam ekspresi lambda apa pun.

  • Ekspresi lambda tidak dimaksudkan untuk digunakan di sisi kiri operator.