Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akce až 50 % zdarma při nákupu e-learningu. Více informací:
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Slevovy týden 3/50

Diskuze: Lambda výrazy - vysvětlení

Aktivity
Avatar
Alesh
Tvůrce
Avatar
Alesh:7.11.2020 22:28

Nevím, jak pořádně používat lambda výrazy.

Zkusil jsem: Narazil jsem na ně zatím víceméně jen v https://www.itnetwork.cz/…ambda-vyrazy , ale tam je to rovnou použito pro určité případy a chybí mi celkový popis, co je a co není možné apod.

Chci docílit: Chtěl bych si nastudovat kompletně lambda výrazy.

 
Odpovědět
7.11.2020 22:28
Avatar
Bugmaster
Člen
Avatar
Bugmaster:7.11.2020 23:57

Řekl bych, že na lambda výrazech není moc co studovat - ta syntaxe není komplikovaná.

Spíš je důležitý pochopit ten koncept: proměnná může obsahovat funkci

Nebo jinak: že si funkci můžeš předávat stejně jako jakoukoliv jinou hodnotu (třeba jako argument jiné funkce).

Lambda výraz je pak jen zkrácený zápis. Technicky vzato se obejdeš i bez ní.

using System;
using System.Collections.Generic;

namespace Lamda
{
  class Program
  {
    static void Main(string[] args)
    {
      var cisla = new List<int>() { -2, 5, 7, -10, 6, 8, 3 };

      /*
       * Co je to predikat:
       *   Funkce, ktera prirazuje prvku true/false. V tomhle pripade rozhoduje o tom, jestli prvek zahrnout to vystupu.
       * Co je Where:
       *   Je to funkce, ktera vezme vsechny prvky ze zadane posloupnosti (1. argument) a vrati jen ty, pro ktere plati predikat (2. argument).
       */

      // 1. verze
      var v1 = System.Linq.Enumerable.Where(cisla, JeSude);
      Vyechovat("v1", v1);

      // 2. verze
      Func<int, bool> predikat = JeSude;
      var v2 = System.Linq.Enumerable.Where(cisla, predikat);
      Vyechovat("v2", v2);

      // 3. verze
      Func<int, bool> predikatLambda = n => n % 2 == 0;
      var v3 = System.Linq.Enumerable.Where(cisla, predikatLambda);
      Vyechovat("v3", v3);

      // 4. verze
      var v4 = System.Linq.Enumerable.Where(cisla, n => n % 2 == 0);
      Vyechovat("v4", v4);

      // Jakpak asi funguje tohle?
      var unknonw = System.Linq.Enumerable.Select(cisla, n => n * 2);
      Vyechovat("?", unknonw);
    }

    static bool JeSude(int n)
    {
      return n % 2 == 0;
    }

    static void Vyechovat(string header, IEnumerable<int> n)
    {
      Console.Write(header);
      Console.Write(": ");
      Console.WriteLine(string.Join(", ", n));
    }

  }
}

Tohle má pak hromadu uplatněních. Je na tom třeba postavený celý Linq nebo komplet konfigurace Kestrelu (webový server v asp.net core).

 
Nahoru Odpovědět
7.11.2020 23:57
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.