LINQ i lambda — wybieranie danych krótkim zapisem
Masz wyniki turnieju i chcesz wybrać tylko te powyżej progu, a potem je posortować. Najpierw rozumiesz pętle, teraz poznasz zapis opisujący operację na danych.
Czego się dziś nauczysz
- Odczytasz prostą lambdę x => warunek.
- Użyjesz Where, OrderBy i ToArray.
- Wyjaśnisz odroczone wykonanie zapytania.
Przygotowanie: lekcje 01–53. Przewidywany czas: 45–90 minut z zadaniami. Przykłady wymagają .NET 8 lub nowszego, z włączonymi ImplicitUsings i Nullable.
Wyjaśnienie krok po kroku
Lambda to mała funkcja
x => x >= 10 oznacza funkcję przyjmującą x i zwracającą wynik porównania. Nazwę x można zmienić na punkty. Where wywołuje tę funkcję dla elementów podczas przechodzenia wyników.
Łączenie operacji
Where wybiera elementy, OrderBy porządkuje je według wskazanego klucza, a Select przekształca każdy element, np. x => x * 2. To metody biblioteki LINQ dostępne po using System.Linq, a nie nowe instrukcje pętli w języku.
Kiedy wykonywana jest praca
Where i OrderBy zwykle tworzą opis zapytania. Praca następuje przy przechodzeniu wyników, np. foreach. ToArray wykonuje zapytanie i zapisuje wynik w nowej tablicy. Późniejsza zmiana źródłowej tablicy liczb nie zmieni już tej tablicy wynikowej.
Przykład do zbadania
Wklej cały przykład do nowego projektu konsolowego jako Program.cs. Zastąp poprzednią zawartość pliku. Nie łącz kilku całych programów w jednym pliku.
using System;
using System.Linq;
int[] punkty = { 12, 4, 18, 10 };
int[] finalisci = punkty.Where(x => x >= 10).OrderBy(x => x).ToArray();
foreach (int wynik in finalisci) Console.WriteLine(wynik);
Console.WriteLine($"Liczba: {finalisci.Length}");
10
12
18
Liczba: 3
Co dzieje się po kolei
- Po Where pozostają 12, 18 i 10.
- OrderBy ustala kolejność 10, 12, 18; x => x oznacza sortowanie według samej liczby.
- ToArray zachowuje wynik. Tablica punkty pozostaje w pierwotnej kolejności.
Użyte w tej lekcji elementy
Metody .NET są gotowymi narzędziami biblioteki. Instrukcje języka i nasze metody oznaczamy osobno. Właściwości, np. Length, odczytujemy bez nawiasów.
| Element | Wynik | Działanie i ograniczenia |
|---|---|---|
Where(warunek) |
IEnumerable<T> | Zwraca sekwencję elementów spełniających predykat, czyli funkcję z wynikiem bool. |
OrderBy(klucz) |
IOrderedEnumerable<T> | Przy przechodzeniu daje porządek rosnący według klucza; sortowanie jest stabilne. |
Select(przeksztalcenie) |
IEnumerable<TResult> | Przekształca elementy funkcją, bez zmieniania źródłowej kolekcji przez samą metodę. |
ToArray() |
T[] | Wykonuje zapytanie i materializuje wynik w tablicy. |
Any() |
bool | Sprawdza, czy sekwencja zawiera co najmniej jeden element. |
Average() dla int |
double | Oblicza średnią; dla pustej sekwencji int zgłasza wyjątek. |
Console.WriteLine(wartosc) |
void | Wyświetla pojedynczy wynik. |
Częste błędy
- Nie myl Where, które filtruje, z Select, które przekształca.
- Zapytanie bez ToArray może odczytać zmienione później dane źródłowe.
- Przed Average na int sprawdź, czy są dane, np. Any.
Skąd się bierze strzałka
Zapis x => x >= 10 to wyrażenie lambda z lekcji 53. Metody LINQ przyjmują je jako zwykłe
argumenty typu Func — nie są nowymi instrukcjami języka.
Zadania
Zmień próg na 15, a potem 100.
Sprawdź: Wyniki: tylko 18, a następnie pusta tablica.
Zastosuj Select, aby podwoić każdy wynik.
Sprawdź: 24, 8, 36, 20; źródło bez zmian.
Odtwórz filtr punktów >= 10 pętlą i List<int>.
Sprawdź: Obie wersje mają ten sam zestaw wyników.
Sprawdź, czy rozumiesz
Wyjaśnij własnymi słowami, jak działa główny przykład i dlaczego daje taki wynik. Następnie zmień jedną daną i przewidź wynik przed uruchomieniem. Wróć do celów lekcji i sprawdź, które potrafisz już wykonać samodzielnie.
Dokumentacja: Microsoft Learn — temat tej lekcji.