by Piotrosz
21. December 2008
Wyrażenie lambda w C# to delegat bez nazwy (delegat anonimowy). Jest to operacja, bądź ciąg operacji bez nazwy. Lewa strona wyrażenia lambda to parametry (może ich w ogóle nie być). Po prawej stronie są zdefiniowane operacje. Obie strony są rozdzielone "=>". W podobny sposób definiuje się funkcję w matematyce i można to sobie z tym skojarzyć.
Na przykład: x => x*x to operacja podnoszenia do kwadratu. "x" jest w tym wyrażeniu zmienną wolną, tzn. jest tylko oznaczeniem i nie ma różnicy jaka litera czy słowo zostanie użyta/użyte. Taka definicja: cx => cx*cx jest dokładnie równoważna poprzedniej.
Pierwsze eksperymenty z wyrażeniami Lambda w C# 3.0:
using System;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
namespace LINQ_4
{
class Program
{
delegate double PodnoszenieDoKwadratu(double x);
delegate double Mnozenie(double x, double y);
delegate string ZwracanieStringa();
static void Main(string[] args)
{
PodnoszenieDoKwadratu p = x => x * x;
double Liczba = p(1.2d);
Console.WriteLine(Liczba); // 1.44
// Musi być nawias jak jest więcej niż 1 argument
Mnozenie m = (x, y) => x * y;
Liczba = m(2d, 3d);
Console.WriteLine(Liczba); // 6
// Wyrażenie Lambda bez parametrów.
// Wyrażenie to jest ciągiem poleceń;
ZwracanieStringa mc = () => { string s = "cześć"; return s; }; // to samo co: () => { "cześć" };
string Slowo = mc();
Console.WriteLine(Slowo); // cześć
// Func to wbudowany delegat generyczny
// Pierwszy parametr to argument, a drugi to zwracany typ
Func EqualToA = x => x == "A";
bool z = EqualToA("B");
Console.WriteLine(z); // False
// Wyrażenie Lambda może być argumentem metody!
int[] Liczby = { 2, 3, 4, 5, 6, 9, 12 };
// Count to metoda rozszerzająca, która jako argument przyjmuje predyktat (wyrażenie lambda)
int IlePodzielnychPrzez3 = Liczby.Count(x => x % 3 == 0);
Console.WriteLine(IlePodzielnychPrzez3); // 4
int PierwszaPodzielnaPrzez3 = Liczby.First(x => x % 3 == 0);
Console.WriteLine(PierwszaPodzielnaPrzez3); // 3
bool CzySaWielokrotnosci4 = Liczby.Any(f => f % 4 == 0 && f != 4);
Console.WriteLine(CzySaWielokrotnosci4); // True
}
}
}