0Pricing
C# Academy · Lekcja

Select i projekcja

Przekształcanie danych w nowe formy

Select i projekcja to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 2 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.

Znaczenie projekcji

Select przekształca każdy element sekwencji w nową postać. Nazywa się to projekcją.

Przyjmuje lambdę, która odwzorowuje jeden element na wynik, i zwraca sekwencję tych wyników, pozostawiając źródło bez zmian.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4 };
var squares = nums.Select(n => n * n);
Console.WriteLine(string.Join(", ", squares));

Zmiana typu

Projekcja może całkowicie zmienić typ elementów. Odwzorowanie int na string tworzy IEnumerable<string>.

Typ wyniku jest wywnioskowany na podstawie typu zwracanego przez lambdę, więc kompilator śledzi go za Państwa.

using System;
using System.Linq;

int[] nums = { 10, 20, 30 };
var labels = nums.Select(n => $"Item #{n}");
foreach (var l in labels) Console.WriteLine(l);

Projekcja właściwości

Częstym zastosowaniem jest pobranie jednej właściwości z obiektów. Select(p => p.Name) przekształca listę obiektów w listę nazw.

W ten sposób dane można ograniczyć do tego, co jest potrzebne przed dalszym przetwarzaniem lub wyświetleniem.

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

record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var names = users.Select(u => u.Name);
Console.WriteLine(string.Join(", ", names));

Wyniki typu anonimowego

Można wykonywać projekcję do typu anonimowego, aby zachować razem kilka pól. W lambdzie należy użyć new { ... }.

Kompilator generuje w locie klasę z właściwościami tylko do odczytu, co doskonale sprawdza się przy kształtowaniu wyników pośrednich.

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

record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var shaped = users.Select(u => new { u.Name, IsAdult = u.Age >= 18 });
foreach (var s in shaped) Console.WriteLine($"{s.Name}:{s.IsAdult}");

Select z indeksem

Podobnie jak Where, Select ma przeciążenie udostępniające indeks liczony od zera. Lambda przyjmuje parametry (element, index).

Jest to idealne rozwiązanie do numerowania elementów lub łączenia każdej wartości z jej pozycją.

using System;
using System.Linq;

string[] tasks = { "Wake", "Eat", "Code" };
var numbered = tasks.Select((t, i) => $"{i + 1}. {t}");
foreach (var n in numbered) Console.WriteLine(n);

Select w składni zapytań

W składni zapytań klauzula select wykonuje projekcję. Można wybrać sam element lub dowolne wyrażenie utworzone na jego podstawie.

Można połączyć ją z where, aby w jednym czytelnym zapytaniu filtrować i kształtować dane.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4, 5 };
var result = from n in nums
             where n % 2 == 1
             select n * 10;
Console.WriteLine(string.Join(", ", result));

SelectMany spłaszcza wynik

Gdy każdy element jest odwzorowywany na kolekcję, użycie Select dałoby sekwencję sekwencji. SelectMany spłaszcza je do jednej sekwencji.

Jest to odpowiednik zagnieżdżonej pętli w LINQ, która łączy wyniki wewnętrzne.

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

var groups = new List<int[]> { new[] {1, 2}, new[] {3, 4} };
var flat = groups.SelectMany(g => g);
Console.WriteLine(string.Join(", ", flat));

Projekcja również jest odroczona

Select korzysta z tego samego modelu odroczonego wykonania. Lambda odwzorowująca jest uruchamiana dopiero podczas enumerowania sekwencji.

Dlatego zbudowanie projekcji jest tanie, a właściwa praca odbywa się podczas iterowania lub materializowania wyniku.

using System;
using System.Linq;

int runs = 0;
int[] nums = { 1, 2, 3 };
var q = nums.Select(n => { runs++; return n; });
Console.WriteLine($"Before: {runs}");
foreach (var _ in q) { }
Console.WriteLine($"After: {runs}");

Najpierw filtruj, potem wykonuj projekcję

Kolejność ma znaczenie dla czytelności i wydajności: najpierw należy filtrować za pomocą Where, a następnie wykonywać projekcję za pomocą Select, aby przekształcać tylko zachowywane elementy.

Taki potok czyta się od góry do dołu i pozwala uniknąć niepotrzebnej pracy projekcji.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4, 5, 6 };
var result = nums.Where(n => n % 2 == 0)
                 .Select(n => n * n);
Console.WriteLine(string.Join(", ", result));

Projekcja do nowego rekordu

Zamiast typów anonimowych można wykonywać projekcję do nazwanego typu lub record. Jest to przydatne, gdy wyniki przekraczają granice metod, ponieważ typów anonimowych nie można zwrócić pod znaną nazwą.

W ten sposób tworzy się również obiekty DTO na podstawie bogatszych obiektów domenowych.

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

record User(string Name, int Age);
record Summary(string Name);
var users = new List<User> { new("Ana", 30) };
var dtos = users.Select(u => new Summary(u.Name));
foreach (var d in dtos) Console.WriteLine(d.Name);

Select zachowuje kolejność i liczbę elementów

W przeciwieństwie do Where, Select nigdy nie dodaje ani nie usuwa elementów — odwzorowuje je jeden do jednego. Wynik ma taką samą liczbę elementów i kolejność jak dane wejściowe.

Jeśli potrzebują Państwo mniejszej liczby elementów, należy użyć filtrowania; jeśli z każdego elementu potrzebnych jest więcej wyników, należy użyć SelectMany.

using System;
using System.Linq;

int[] nums = { 5, 1, 9 };
var doubled = nums.Select(n => n * 2);
Console.WriteLine($"In:{nums.Length} Out:{doubled.Count()}");

Szybkie sprawdzenie

Wybierz właściwy operator do danego zadania.

Podsumowanie

Select wykonuje projekcję każdego elementu do nowej postaci — właściwości, ciągu znaków, typu anonimowego lub rekordu — zachowując relację jeden do jednego pod względem liczby i kolejności elementów. Ma przeciążenie z indeksem i działa odroczone.

SelectMany spłaszcza zagnieżdżone sekwencje. Następnie posortujemy i pogrupujemy ukształtowane dane.

Często zadawane pytania

Czy lekcja „Select i projekcja” jest bezpłatna?

Tak — pełny tekst „Select i projekcja” 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 „Select i projekcja”?

Przekształcanie danych w nowe formy Ć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 2 z 4.

Ile czasu zajmuje lekcja „Select i projekcja”?

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