Lekce 16: Lambda výrazy a LINQ – Efektivní manipulace s kolekcemi v C#
Lambda výrazy a jazykově integrovaný dotazovací systém (LINQ, Language Integrated Query) jsou jedny z nejsilnějších nástrojů jazyka C#. Tyto koncepty umožňují psát čitelnější, kompaktnější a efektivnější kód při práci s kolekcemi a daty. V této lekci si podrobně vysvětlíme, co jsou lambda výrazy, jak fungují LINQ dotazy, a jak je kombinovat pro manipulaci a filtrování dat.
1. Lambda výrazy v C#
Lambda výrazy jsou stručný způsob, jak zapisovat anonymní metody, které lze přiřadit delegátům nebo použít v rámci LINQ dotazů. Mají následující základní formát:
(parametry) => výraz nebo blok kódu
Jednoduchý příklad lambda výrazu
Func<int, int> nasobDva = x => x * 2;
Console.WriteLine(nasobDva(5)); // Výstup: 10
V tomto příkladu je nasobDva
delegát typu Func<int, int>
, který přijímá jeden parametr a vrací výsledek jeho násobení dvěma.
Lambda výrazy s více parametry
Func<int, int, int> scitej = (a, b) => a + b;
Console.WriteLine(scitej(3, 7)); // Výstup: 10
2. LINQ v C#
LINQ je vestavěná funkcionalita C#, která umožňuje psát dotazy na kolekce podobně jako SQL dotazy na databáze. LINQ funguje s různými zdroji dat, včetně kolekcí, XML, databází a dalších.
Základní syntaxe LINQ dotazu
LINQ dotazy lze zapisovat dvěma způsoby:
- Dotazovací syntaxe (Query Syntax)
- Metodová syntaxe (Method Syntax)
Dotazovací syntaxe:
int[] cisla = { 1, 2, 3, 4, 5, 6 };
var sudych = from cislo in cisla
where cislo % 2 == 0
select cislo;
foreach (var cislo in sudych)
{
Console.WriteLine(cislo);
}
Metodová syntaxe:
var sudych = cisla.Where(cislo => cislo % 2 == 0);
foreach (var cislo in sudych)
{
Console.WriteLine(cislo);
}
Obě syntaxe vrátí sudá čísla z pole cisla
.
3. Kombinace lambda výrazů a LINQ
Kombinace lambda výrazů a LINQ je výkonný nástroj pro manipulaci s kolekcemi. Pomocí lambda výrazů můžeme zapisovat metody jako Where, Select, OrderBy, atd.
Filtrování dat pomocí Where
List<int> cisla = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var sudaCisla = cisla.Where(x => x % 2 == 0);
foreach (var cislo in sudaCisla)
{
Console.WriteLine(cislo); // Výstup: 2, 4, 6, 8
}
Transformace dat pomocí Select
Metoda Select umožňuje transformaci každého prvku kolekce na jiný formát nebo hodnotu.
var kvadraty = cisla.Select(x => x * x);
foreach (var kvadrat in kvadraty)
{
Console.WriteLine(kvadrat); // Výstup: 1, 4, 9, 16, ...
}
4. Pokročilé použití LINQ
Seřazení dat pomocí OrderBy
var sestupne = cisla.OrderByDescending(x => x);
foreach (var cislo in sestupne)
{
Console.WriteLine(cislo); // Výstup: 9, 8, 7, ...
}
Skupinování dat pomocí GroupBy
var skupiny = cisla.GroupBy(x => x % 2 == 0 ? "Sudá" : "Lichá");
foreach (var skupina in skupiny)
{
Console.WriteLine($"Skupina: {skupina.Key}");
foreach (var cislo in skupina)
{
Console.WriteLine(cislo);
}
}
5. LINQ to Objects vs. LINQ to SQL
- LINQ to Objects: Pracuje s kolekcemi v paměti, jako jsou pole, seznamy a další kolekce.
- LINQ to SQL: Umožňuje psát dotazy na relační databáze pomocí podobné syntaxe jako LINQ to Objects.
Příklad LINQ to SQL:
using (var context = new DatabazeContext())
{
var studenti = from student in context.Studenti
where student.Vek > 20
select student;
foreach (var student in studenti)
{
Console.WriteLine(student.Jmeno);
}
}
6. Výhody použití lambda výrazů a LINQ
- Čitelnost kódu: Dotazy jsou kompaktní a snadno čitelné.
- Modularita: LINQ dotazy lze snadno kombinovat a rozšiřovat.
- Flexibilita: Práce s různými zdroji dat (kolekce, databáze, XML).
- Výkon: LINQ dotazy jsou optimalizovány pro efektivní zpracování dat.
Závěr
Lambda výrazy a LINQ jsou nezbytné nástroje pro vývojáře C#. Tyto koncepty zjednodušují práci s kolekcemi, umožňují rychlou manipulaci s daty a podporují modularitu a čitelnost kódu. Pochopení těchto nástrojů vám umožní vytvářet efektivní a udržovatelný kód pro moderní aplikace.