Výrazy lambda

Výraz lambda zvolte, když chcete předat krátkou operaci jiné metodě a operace je nejjasnější vedle volání, které ji používá. Vložené pravidlo ukazuje čtenářům, jak vyberete nebo transformujete položky; pojmenovaná metoda jim umožní sledovat účel operace, než prozkoumají její podrobnosti.

Tip

Tento článek představuje praktické volby pro vývojáře, kteří znají metody a kolekce jazyka C#. Úplnou syntaxi a pravidla lambda najdete v referenčních informacích k výrazům lambda.

Výraz lambda je nepojmenovaná funkce, kterou napíšete tam, kde jiná část kódu potřebuje určité chování.

Následující lambda přijme session a vrátí, jestli má session otevřená místa:

session => session.Registered < session.Capacity

Operátor => odděluje parametry vlevo od těla vpravo. Přečtěte si ho jako „goes to“.

Předání chování metodě

Mnoho .NET API přijímá delegáta, což je typ, který představuje chování s konkrétním seznamem parametrů a návratovým typem. Lambda funkce toto chování poskytuje. Úvod k typům delegátů, jako jsou Func a Action, naleznete v tématu Výrazy lambda, delegáty a události.

Následující příklad je určen pro lekce workshopu. WorkshopSession obsahuje název, dobu trvání, kapacitu a počet registrací.

int maximumMinutes = 60;

var shortSessions = sessions
    .Where(session => session.DurationMinutes <= maximumMinutes)
    .OrderBy(session => session.Title);

foreach (WorkshopSession session in shortSessions)
{
    Console.WriteLine(session.Title);
}

První lambda říká Where , které relace se mají zachovat. Druhá říká OrderBy , podle které hodnoty se má řadit. Metody přijímají chování bez znalosti podrobností o některém z pravidel.

Zvolte formulář parametru

Zvolte nejkratší formu parametru, která zůstane srozumitelná:

session => session.DurationMinutes <= 60

U jednoho parametru vynecháte závorky, když kompilátor může typ odvodit. Pro žádné parametry použijte prázdné závorky:

() => DateTime.Now

Pro dva nebo více parametrů použijte závorky:

(left, right) => left + right

Metoda, která přijímá lambda poskytuje dostatek informací pro kompilátor k odvození typů parametrů. Pokud odvozování potřebuje pomoc nebo když typy zlepšují srozumitelnost, napište explicitní typy:

(WorkshopSession session) => session.Title

Referenční informace k výrazům lambda se týkají modifikátorů parametrů, atributů, výchozích hodnot a dalších specializovaných forem.

Zvolte výraz nebo tělo příkazu

lambdový výraz použijte, když jeden výraz vypočítá výsledek:

session => session.Registered < session.Capacity

Lambda s blokem příkazů použijte, pokud operace potřebuje více než jeden příkaz. Uzavřete tělo do složených závorek a zahrňte return , když lambda vrátí hodnotu:

var descriptions = sessions.Select(session =>
{
    int seatsLeft = session.Capacity - session.Registered;
    string availability = seatsLeft > 0 ? $"{seatsLeft} seats left" : "full";
    return $"{session.Title}: {availability}";
});

Console.WriteLine(string.Join(Environment.NewLine, descriptions));

Udržujte statement lambdas stručné. Pokud tělo potřebuje několik kroků nebo se stejná logika objeví více než jednou, pojmenujte toto chování popisným názvem pomocí místní funkce nebo běžné metody.

Zachytit hodnoty z okolního rozsahu

Lambda může použít proměnnou deklarovanou v okolní metodě. Toto použití se nazývá capture. V prvním příkladu lambda výběru zachytí maximumMinutes:

int maximumMinutes = 60;
var shortSessions = sessions.Where(
    session => session.DurationMinutes <= maximumMinutes);

Funkce Capture pomáhá krátkému pravidlu využívat lokální kontext. Lambda zachycuje samotnou proměnnou, nikoli kopii její hodnoty. Pokud se proměnná změní před spuštěním lambda, lambda vidí aktuální hodnotu.

Usnadněte identifikaci potřebného kontextu. Pokud lambda nepotřebuje okolní stav, přidejte static , aby se zabránilo náhodnému zachycení a aby byla tato nezávislost viditelná pro čtenáře:

var openSessions = sessions.Where(
    static session => session.Registered < session.Capacity);

Statická lambda může používat své parametry, hodnoty, které deklaruje, konstanty a statické členy. Z okolního kódu nemůže používat místní proměnné ani stav instance.

Zvolte lambda výraz, skupinu metod nebo místní funkci

Několik forem jazyka C# může dodat chování parametru delegáta:

  • Pro krátké chování, které je u volání dobře čitelné, použijte výraz lambda.
  • Skupinu metod použijte, pokud má existující metoda požadovaný podpis a její název vysvětluje chování.
  • Místní funkci použijte, když člen, který ji obsahuje, vyžaduje znovu použitelnou pojmenovanou logiku, rekurzi nebo tělo, které je pro vložené lambda příliš velké.
  • Použijte běžnou metodu, když více členů potřebuje toto chování.

Skupina přetížení metody je název metody bez seznamu parametrů. Kompilátor převede odpovídající metodu na požadovaný typ delegáta:

var openSessions = sessions.Where(HasOpenSeats);

foreach (WorkshopSession session in openSessions)
{
    Console.WriteLine($"Open: {session.Title}");
}

static bool HasOpenSeats(WorkshopSession session) =>
    session.Registered < session.Capacity;

Where(HasOpenSeats) vyjadřuje stejné pravidlo jako Where(session => HasOpenSeats(session)) s menším množstvím kódu. Název metody říká čtenářům, co pravidlo testuje; vložené porovnání ukazuje, jak toto pravidlo testuje. Lambda obal ponechte, když přidá argument, zkombinuje operace nebo zpřehlední volání.

Podrobné místní porovnání naleznete v tématu Místní funkce.

Viz také