Paweł Łukasiewicz
2015-07-12
Paweł Łukasiewicz
2015-07-12
Udostępnij Udostępnij Kontakt

Wyrażenie lambda to anonimowa metoda, która najczęściej jest używana do tworzenia delegatów w LINQ. Mówiąc innymi słowami, jest to metoda bez deklaracji.

Jest to bardzo wygodne. Skrót taki pozwala na napisanie metody w dokładnie tym miejscu, w którym chcemy jej użyć. Szczególnie przydatne, kiedy metoda jest wywoływana tylko raz a jej definicja jest krótka. Oszczędza to czas potrzebny na deklarację i pisanie oddzielnej metody.


Korzyści

Wyrażenie lambda powinno być krótkie. Kompleksowa definicja może być trudna w odczytaniu.

Najprostsza możliwa definicja: Parametry => kod do wykonania.

  1. Czym są wyrażenia lambda?
  2. Dlaczego potrzebujemy wyrażeń lambda? (Po co mielibyśmy pisać metody bez nazw?)
    • Zmniejszamy potrzebę pisania. Nie ma potrzeby określania nazwy metody, jedynie typ zwracany oraz modyfikator dostępu;
    • W trakcie analizy kodu nie musimy szukać jej definicji.
  3. Jak zdefiniować wyrażenie lambda?

Najprostszy przykład:

n => n % 2 == 1
  • n to parametr wejściowy;
  • n % 2 == 1 to wyrażenie.
Powyższy przykład n => n % 2 == 1 możesz odczytać w następujący sposób: Parametr wejściowy o nazwie n idzie do metody anonimowej, która zwraca true, jeżeli parametr wejściowy jest nieparzysty.
Kolejny przykład (tym razem wraz z wykonaniem wyrażenia lambda):
using System;
using System.Collections.Generic;
using System.Linq;
namespace LambdaExpression
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> number = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            // Tworzymy listę liczb nieparzystych
            // W pierwszej kolejności używamy metody rozszerzającej dla naszej kolekcji (.Where)
            // A następnie wyrażenia lambda do sprawdzenia, które liczby są niepatrzyste
            List<int> oddNumber = number.Where(n => n % 2 == 1).ToList();
            // Wypisujemy liczby niepatrzyste 
            Console.WriteLine("Liczby niepatrzyste: ");
            foreach (var item in oddNumber)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
            // Wynik działania programu
            // Liczby niepatrzyste:
            // 1
            // 3
            // 5
            // 7
            // 9
        }
    }
}


Delegaty

W powyższej części artykuły zostało powiedziane, że wyrażenia lambda są używane, aby przekazać parametr do anonimowej metody. Przed powstaniem wyrażeń lambda ten sam rezultat mogliśmy osiągnąć przez używanie słowa kluczowego delegate. Delegaty mają liczne zalety, zaliczamy do nich m.in.: możliwość wywołania wielu metod przed jednego delegata oraz zachowują się jak "interfejs metody".
Delegat może być zaimplementowany jako metoda anonimowa:

delegate double MultiplyNumbers(int a, int b);
public void Execute()
{
    // Definicja metody anonimowej przy użyciu delegata
    MultiplyNumbers multiply = delegate (int number1, int number2)
    {
        return number1 * number2;
    };
    // Oraz wykonanie
    double result = multiply(4, 3);
}
Powyższy kod zapisany przy użyciu wyrażenia lambda:
public void ExecuteByLambda()
{
    MultiplyNumbers multiply = (number1, number2) =>
        {
            return number1 * number2;
        };
}
Składnia bardzo podobna, jednakże nieco prostsza.