0Pricing
C# Academy · Lekcja

Where i filtrowanie

Wybieranie pasujących elementów

Where i filtrowanie to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Co robi Where

Where to podstawowy operator filtrowania w LINQ. Przyjmuje predykat — funkcję zwracającą bool — i zwraca wyłącznie elementy, które go spełniają.

Znajduje się w System.Linq i działa na dowolnym IEnumerable<T>, zwracając nową sekwencję zamiast modyfikować źródło.

using System;
using System.Linq;
using System.Collections.Generic;

var nums = new List<int> { 1, 2, 3, 4, 5, 6 };
var evens = nums.Where(n => n % 2 == 0);
Console.WriteLine(string.Join(", ", evens));

Lambda predykatu

Argumentem funkcji Where jest lambda n => condition. Parametr reprezentuje każdy element, a treść lambdy musi zwracać wartość true lub false.

Zwrócenie true zachowuje element, a false go odrzuca. Można użyć dowolnego wyrażenia logicznego.

using System;
using System.Linq;

string[] words = { "apple", "fig", "banana", "kiwi" };
var shortWords = words.Where(w => w.Length <= 4);
Console.WriteLine(string.Join(", ", shortWords));

Postać składni zapytań

LINQ oferuje składnię zapytań, która przypomina język SQL. Klauzula where filtruje, a select wykonuje projekcję.

Jest ona kompilowana do tych samych wywołań metod, więc from x in src where ... select x jest równoważne z src.Where(...). Należy wybrać zapis, który jest czytelniejszy.

using System;
using System.Linq;

int[] scores = { 40, 75, 90, 55, 88 };
var passing = from s in scores
              where s >= 60
              select s;
Console.WriteLine(string.Join(", ", passing));

Łączenie warunków

W ramach jednego predykatu można łączyć wiele sprawdzeń za pomocą && i ||. Dzięki temu powiązane filtrowanie odbywa się w jednym przebiegu.

Nawiasy zwiększają czytelność przy łączeniu operatorów, podobnie jak w każdym wyrażeniu logicznym.

using System;
using System.Linq;
using System.Collections.Generic;

var ages = new List<int> { 12, 17, 21, 35, 64, 70 };
var adults = ages.Where(a => a >= 18 && a < 65);
Console.WriteLine(string.Join(", ", adults));

Łączenie wywołań Where

Można łączyć wiele wywołań Where. Każde z nich filtruje wynik poprzedniego, więc warunki są łączone logicznym AND.

Łączenie wywołań bywa czytelniejsze niż jeden duży predykat i pozwala komponować filtry budowane w różnych miejscach.

using System;
using System.Linq;

int[] data = { 3, 8, 15, 22, 27, 40 };
var result = data.Where(n => n > 5)
                 .Where(n => n % 2 == 0);
Console.WriteLine(string.Join(", ", result));

Where z indeksem

Jedno z przeciążeń Where udostępnia indeks elementu liczony od zera jako drugi parametr lambdy. Jest to przydatne przy filtrowaniu zależnym od pozycji.

Można dzięki temu zachować na przykład co drugi element albo pominąć pierwszy element na podstawie indeksu.

using System;
using System.Linq;

string[] items = { "a", "b", "c", "d", "e" };
var evenIdx = items.Where((val, idx) => idx % 2 == 0);
Console.WriteLine(string.Join(", ", evenIdx));

Filtrowanie obiektów

Filtrowanie jest szczególnie użyteczne w przypadku kolekcji obiektów. Predykat może odczytywać dowolną właściwość każdego elementu.

W ten sposób deklaratywnie wyraża się reguły biznesowe — na przykład „klienci z tego miasta” czy „zamówienia powyżej określonego progu”.

using System;
using System.Linq;
using System.Collections.Generic;

record Product(string Name, decimal Price);
var list = new List<Product> {
  new("Pen", 1.5m), new("Lamp", 20m), new("Mug", 8m) };
var cheap = list.Where(p => p.Price < 10);
foreach (var p in cheap) Console.WriteLine(p.Name);

Odroczone wykonanie

Where korzysta z odroczonego wykonania: nie wykonuje się w chwili zdefiniowania, lecz dopiero podczas iterowania po sekwencji, na przykład w pętli foreach lub po wywołaniu ToList.

Oznacza to, że zmiany w źródle wprowadzone przed iteracją zostaną uwzględnione w wyniku.

using System;
using System.Linq;
using System.Collections.Generic;

var src = new List<int> { 1, 2 };
var q = src.Where(n => n > 1);
src.Add(5);
Console.WriteLine(string.Join(", ", q));

Koszt ponownej ewaluacji

Ponieważ filtrowanie jest odroczone, dwukrotne iterowanie po tym samym zapytaniu uruchamia predykat dwa razy. W przypadku kosztownych predykatów lub dynamicznych źródeł może to być zaskakujące.

Gdy potrzebna jest stabilna migawka wielokrotnego użytku, należy raz zmaterializować wynik za pomocą ToList — zostanie to omówione w dalszej części kursu.

using System;
using System.Linq;

int calls = 0;
int[] nums = { 1, 2, 3 };
var q = nums.Where(n => { calls++; return n > 1; });
foreach (var _ in q) { }
foreach (var _ in q) { }
Console.WriteLine(calls);

Najpierw filtruj, potem zliczaj

Często stosuje się wzorzec polegający na filtrowaniu, a następnie sprawdzeniu, ile elementów pasuje. Count może bezpośrednio przyjąć predykat, łącząc filtrowanie i zliczanie.

count.Count(p => cond) jest równoważne z seq.Where(p => cond).Count(), ale zapis jest bardziej zwięzły.

using System;
using System.Linq;

int[] grades = { 55, 80, 42, 91, 67 };
int passed = grades.Count(g => g >= 60);
Console.WriteLine($"Passed: {passed}");

Puste wyniki są w porządku

Jeśli żaden element nie spełnia predykatu, Where po prostu zwraca pustą sekwencję — nigdy null.

Dzięki temu filtry można bezpiecznie łączyć: pusty wynik przechodzi przez kolejne operatory bez specjalnego traktowania.

using System;
using System.Linq;

int[] nums = { 1, 2, 3 };
var big = nums.Where(n => n > 100);
Console.WriteLine($"Count: {big.Count()}");

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat odroczonego wykonania.

Podsumowanie

Where filtruje sekwencję za pomocą predykatu logicznego, zwracając nowe IEnumerable. Ma przeciążenie z indeksem, można go łączyć lub używać z &&/||, a także stosować do obiektów za pośrednictwem ich właściwości.

Co najważniejsze, jego wykonanie jest odroczone — operator działa podczas iteracji, więc ponowne iterowanie powoduje ponowną ewaluację. Następnie zajmiemy się kształtowaniem zachowywanych danych za pomocą Select.

Często zadawane pytania

Czy lekcja „Where i filtrowanie” jest bezpłatna?

Tak — pełny tekst „Where i filtrowanie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Where i filtrowanie”?

Wybieranie pasujących elementów Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Where i filtrowanie”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Where i filtrowanie
  2. Select i projekcja
  3. OrderBy i grupowanie
  4. Agregaty i ToList
← Powrót do C# Academy