Lambdy zwykle są używane w momencie jeśli niema potrzeby pisania standardowej funkcji do wykonania jakiejś operacji (i jest ona nie wielka). Np. jeśli chcesz wywołać jakąś funkcję która przyjmuje jako parametr delegatę to możesz podać że tą delegatą jest standardowa funkcja lub lambda. Jeśli kod delegaty który ma sie wykonać jest krótki to bardziej czytelnie może być napisanie lambdy zamiast osobnej funkcji bo nie trzeba będzie za każdym razem lecieć do definicji funkcji aby sprawdzić co i jak. Dobrym przykładem miejsc gdzie wykorzystuje się lambdy jest Linq. Np. Linq pozwala na użycie funkcji .Select() na IEnumerable<T>. Poniżej 2 przykłady tego samego zapytania Linq. Pierwszy z użyciem lambdy a drugi z użyciem funkcji
using System;
using System.Linq;
namespace ConsoleApp_CSharp
{
internal class Program
{
private static void Main(string[] args)
{
int[] tablica = new int[] { 1, 2, 3, 4, 5 };
var nowaTablica = tablica.Select(element => element * element);
foreach (var element in tablica)
Console.Write("{0} ", element);
Console.WriteLine();
foreach (var element in nowaTablica)
Console.Write("{0} ", element);
Console.ReadLine();
}
}
}
using System;
using System.Linq;
namespace ConsoleApp_CSharp
{
internal class Program
{
private static void Main(string[] args)
{
int[] tablica = new int[] { 1, 2, 3, 4, 5 };
var nowaTablica = tablica.Select(DoubleElement);
foreach (var element in tablica)
Console.Write("{0} ", element);
Console.WriteLine();
foreach (var element in nowaTablica)
Console.Write("{0} ", element);
Console.ReadLine();
}
private static int DoubleElement(int element)
{
return element * element;
}
}
}
Jest to dosyć prosty przykład ale najczęściej się lambdy wykorzystuje właśnie do tego typu rzeczy bo pisanie za każdym razem funkcji byłoby bardziej męczące i czasochłonne.
Podsumowując jeśli mamy jakiś kod (najlepiej nie długi) który jest wykorzystywany tylko w jednym miejscu jako parametr innej funkcji lepiej użyć lambd. Dzięki temu możesz pominąć wymyślanie nazwy dla takiej funkcji a jednocześnie możliwe że zwiększysz czytelność kodu (choć nie koniecznie) bo nie trzeba skakać do definicji funkcji aby sprawdzić jak się zachowuje tylko widać wszystko w miejscu użycia. Dodatkowo zaoszczędzisz także trochę czasu.
Przykład innego użycia lambdy w Linq:
using System;
using System.Linq;
namespace ConsoleApp_CSharp
{
internal class Program
{
private class Ludek
{
public string Imie;
public string Klasa;
};
private static void Main(string[] args)
{
Ludek[] ludkowie = new Ludek[]
{
new Ludek() { Imie = "Edek", Klasa = "woj" },
new Ludek() { Imie = "Zdzisiek", Klasa = "mag" },
new Ludek() { Imie = "Patapon", Klasa = "woj" },
new Ludek() { Imie = "Edmund", Klasa = "kraweznik"}
};
Console.WriteLine("Pokaż wszystkie imiona i klasy w formacie imie (klasa)");
foreach (var imieIKlasa in ludkowie.Select(ludek => string.Format("{0} ({1}) ", ludek.Imie, ludek.Klasa)))
Console.Write(imieIKlasa);
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("Imiona wszystkich co mają klasę woj");
var imionaWojownikow = ludkowie.Where(ludek => ludek.Klasa == "woj").Select(ludek => ludek.Imie);
foreach (var imie in imionaWojownikow)
Console.Write("{0} ", imie);
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("Klasy wszystkich których imiona zaczynają się na Ed");
foreach (var klasa in ludkowie.Where(ludek => ludek.Imie.StartsWith("Ed")).Select(ludek => ludek.Klasa))
Console.Write("{0} ", klasa);
Console.ReadLine();
}
}
}
Jeśli coś w tym wyjaśnieniu byłoby nie jasne to daj znać