0Pricing
C# Academy · Lekcja

Agregaty i ToList

Zliczanie, sumowanie i materializowanie

Agregaty i ToList to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 4 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.

Zliczanie elementów

Count zwraca liczbę elementów w sekwencji. W połączeniu z predykatem zlicza tylko pasujące elementy.

Wymusza wyliczenie sekwencji, więc aby obliczyć wynik, przechodzi przez całą sekwencję — jest to operacja agregująca.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4, 5 };
Console.WriteLine(nums.Count());
Console.WriteLine(nums.Count(n => n > 2));

Sumowanie wartości

Sum dodaje wartości liczbowe. Dla sekwencji liczbowej sumuje jej elementy, a w połączeniu z selektorem sumuje wartość uzyskaną z każdego elementu.

Zwraca ten sam typ liczbowy co źródło lub wynik selektora.

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

record Order(int Qty, decimal Price);
var orders = new List<Order> { new(2, 5m), new(3, 4m) };
decimal total = orders.Sum(o => o.Qty * o.Price);
Console.WriteLine(total);

Obliczanie średniej

Average oblicza średnią arytmetyczną. Podobnie jak Sum, przyjmuje opcjonalny selektor.

Wynik ma typ zmiennoprzecinkowy, na przykład double, nawet gdy źródło zawiera liczby całkowite, dzięki czemu dzielenie nie powoduje utraty precyzji.

using System;
using System.Linq;

int[] scores = { 80, 90, 100 };
double avg = scores.Average();
Console.WriteLine(avg);

Min i Max

Min i Max zwracają odpowiednio najmniejsze i największe wartości. W połączeniu z selektorem redukują dane do wartości wybranego klucza.

We współczesnym .NET metody MaxBy i MinBy zwracają cały element mający skrajną wartość klucza, a nie tylko wartość tego klucza.

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

record P(string Name, int Age);
var ps = new List<P> { new("Ana", 30), new("Bo", 22) };
var oldest = ps.MaxBy(p => p.Age);
Console.WriteLine(oldest!.Name);

Pułapki związane z pustą sekwencją

Dla pustej sekwencji metody Average, Min i Max użyte dla typów wartości zgłaszają wyjątek InvalidOperationException. Sum zwraca zero, a Count również zwraca zero.

Przed obliczaniem średniej dla danych, które mogą być puste, należy sprawdzić wynik za pomocą Any() lub użyć DefaultIfEmpty.

using System;
using System.Linq;

int[] empty = Array.Empty<int>();
double avg = empty.DefaultIfEmpty(0).Average();
Console.WriteLine(avg);

Aggregate do niestandardowego składania

Aggregate składa sekwencję do jednej wartości za pomocą funkcji akumulatora. Jest ogólną postacią mechanizmu, na którym opierają się między innymi Sum i podobne metody.

Można podać wartość początkową i łączyć z nią kolejne elementy, tworząc bieżący wynik — jest to przydatne przy mnożeniu, łączeniu tekstów i niestandardowej logice.

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4 };
int product = nums.Aggregate(1, (acc, n) => acc * n);
Console.WriteLine(product);

Materializacja za pomocą ToList

ToList natychmiast wykonuje zapytanie i kopiuje wyniki do obiektu List<T>. W ten sposób celowo kończy odroczone wykonanie.

Można jej użyć do utworzenia stabilnego obrazu danych, uniknięcia ponownego uruchamiania kosztownego potoku lub uzyskania funkcji listy, takich jak indeksowanie i właściwość Count.

using System;
using System.Linq;

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

ToArray i ToDictionary

Powiązane metody materializujące to ToArray, która tworzy tablicę o stałym rozmiarze, oraz ToDictionary, która tworzy słownik umożliwiający wyszukiwanie według klucza.

ToDictionary przyjmuje selektor klucza oraz opcjonalny selektor wartości i zgłasza wyjątek, jeśli dwa elementy wygenerują ten sam klucz.

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

record P(string Name, int Age);
var ps = new List<P> { new("Ana", 30), new("Bo", 22) };
var byName = ps.ToDictionary(p => p.Name, p => p.Age);
Console.WriteLine(byName["Ana"]);

Dlaczego warto materializować dane

Odroczone zapytania są wykonywane ponownie przy każdej iteracji. Jeśli potok jest kosztowny lub odczytuje zmieniające się źródło, takie powtórzenia powodują błędy i spowalniają działanie.

Jednokrotne wywołanie ToList przechwytuje wyniki, dzięki czemu późniejsze odczyty są szybkie i spójne.

using System;
using System.Linq;

int runs = 0;
int[] nums = { 1, 2, 3 };
var list = nums.Select(n => { runs++; return n; }).ToList();
foreach (var _ in list) { }
foreach (var _ in list) { }
Console.WriteLine(runs);

First, Single i Any

Operatory elementów również wymuszają wykonanie. First zwraca pierwsze pasujące wystąpienie i zgłasza wyjątek, jeśli go nie ma, FirstOrDefault zwraca zamiast tego wartość domyślną, a Single wymaga dokładnie jednego elementu.

Any informuje, czy sekwencja zawiera choć jeden pasujący element, bez konieczności zliczania wszystkich elementów.

using System;
using System.Linq;

int[] nums = { 3, 8, 5, 12 };
int firstBig = nums.First(n => n > 7);
bool hasOdd = nums.Any(n => n % 2 == 1);
Console.WriteLine($"{firstBig} {hasOdd}");

Pełny potok

Rzeczywiste zapytania łączą filtrowanie, projekcję, sortowanie i agregowanie, często kończąc się użyciem metody materializującej.

Należy czytać je od góry do dołu: najpierw filtrowanie, następnie kształtowanie danych, potem sortowanie i na końcu zebranie wyników. Końcowe ToList uruchamia cały potok jednokrotnie.

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

record Sale(string City, int Amt);
var sales = new List<Sale> { new("NY", 5), new("LA", 3), new("NY", 9) };
var top = sales.Where(s => s.Amt > 4)
               .OrderByDescending(s => s.Amt)
               .Select(s => s.City)
               .ToList();
Console.WriteLine(string.Join(", ", top));

Szybkie sprawdzenie

Zastanówmy się nad odroczonym wykonaniem i materializacją.

Podsumowanie

Operacje agregujące redukują sekwencję do jednej wartości: Count, Sum, Average, Min/Max, MinBy/MaxBy oraz ogólna metoda Aggregate. Wymuszają wykonanie i mogą zgłaszać wyjątki dla pustych źródeł.

ToList, ToArray i ToDictionary materializują wyniki, kończąc odroczenie, dzięki czemu kosztowny potok jest uruchamiany tylko raz. To kończy zestaw narzędzi LINQ do filtrowania i projekcji.

Często zadawane pytania

Czy lekcja „Agregaty i ToList” jest bezpłatna?

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

Zliczanie, sumowanie i materializowanie Ć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 4 z 4.

Ile czasu zajmuje lekcja „Agregaty i ToList”?

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