🔥 Zapisy zamknięte, ale możesz pobrać Roadmapę .NET i dołączyć do listy oczekujących — Pobierz i dołącz do Listy VIP →

Lista w C# — możliwości wykorzystania

Listy są bardzo podobne do tablic, ale w przeciwieństwie do nich można swobodnie zmieniać ich rozmiar — List<T> automatycznie rośnie i kurczy się wraz z zawartością. Podstawowe operacje (AddInsertRemove, wyszukiwanie) omawiamy w osobnych artykułach: Dodawanie elementów do List<T> i wstawianie, wyszukiwanie i usuwanie. Tutaj skupiamy się na tym, co dzieje się poza pojedynczymi operacjami — jak sortować, filtrować masowo i przekształcać listy w praktycznych scenariuszach.

Sortowanie listy

List<T> ma wbudowaną metodę Sort(), która sortuje elementy w miejscu (modyfikuje oryginalną listę):

var liczby = new List<int> { 5, 2, 8, 1, 9 };
liczby.Sort();
// [1, 2, 5, 8, 9]

var miasta = new List<string> { "Kraków", "Gdańsk", "Białystok" };
miasta.Sort((a, b) => a.Length.CompareTo(b.Length)); // sortowanie po długości nazwy

Jeśli nie chcesz modyfikować oryginalnej listy, użyj LINQ — OrderBy() zwraca nową posortowaną sekwencję:

var posortowane = miasta.OrderBy(m => m).ToList(); // oryginalna lista `miasta` bez zmian

Masowe filtrowanie i usuwanie — RemoveAll

Zamiast iterować ręcznie i usuwać elementy pojedynczo (co jest ryzykowne podczas iteracji — patrz artykuł o foreach), RemoveAll usuwa wszystkie elementy spełniające warunek w jednym wywołaniu:

var zamowienia = new List<Zamowienie> { /* ... */ };

// Usuwa wszystkie anulowane zamówienia, zwraca liczbę usuniętych
int usuniete = zamowienia.RemoveAll(z => z.Status == "Anulowane");

Do filtrowania bez modyfikacji oryginału użyj LINQ Where():

var aktywne = zamowienia.Where(z => z.Status == "Aktywne").ToList();

Operacje wsadowe — AddRange i InsertRange

Gdy dodajesz wiele elementów naraz, AddRange jest zarówno czytelniejszy, jak i wydajniejszy niż pętla z pojedynczymi Add — pozwala liście od razu zaalokować odpowiednią pojemność zamiast rozszerzać ją stopniowo:

var nowMiasta = new List<string> { "Poznań", "Łódź" };
miasta.AddRange(nowMiasta);

// InsertRange — wstawia całą kolekcję w konkretnym miejscu
miasta.InsertRange(0, new[] { "Warszawa" });

Konwersja między List<T> a tablicą

// Lista → tablica
int[] tablica = liczby.ToArray();

// Tablica → lista
List<int> zTablicy = new List<int>(tablica);
// albo, od C# 12, przez collection expression:
List<int> zTablicy2 = [.. tablica];

To przydaje się, gdy API biblioteki zewnętrznej oczekuje tablicy, a Twój kod operuje na liście (lub odwrotnie) — konwersja jest tania (O(n)), ale nie darmowa, więc nie rób jej bez potrzeby w gorącej ścieżce wykonania.

Praktyczne scenariusze

  • Koszyk zakupowy — dynamicznie rosnąca lista produktów, z częstym dodawaniem na końcu i sporadycznym usuwaniem konkretnej pozycji.
  • Historia cofania (undo) — lista kolejnych stanów aplikacji, z których najczęściej odczytujesz ostatni element (choć do tego czystszym wyborem bywa Stack<T>, jeśli naprawdę potrzebujesz wyłącznie LIFO).
  • Wyniki wyszukiwania/filtrowania — lista budowana raz jako wynik zapytania LINQ (.Where(...).ToList()), potem tylko odczytywana.
  • Bufor danych do przetworzenia wsadowego — zbierasz elementy metodą Add aż osiągniesz określony rozmiar paczki, potem przetwarzasz i czyścisz (Clear()).

Wspólny mianownik tych scenariuszy: dominują operacje na końcu listy (dodawanie, czasem odczyt ostatniego elementu) albo pełne przejście po wszystkich elementach. Gdy zaczynasz często wstawiać lub usuwać elementy ze środka czy początku dużej listy, warto sprawdzić, czy List<T> to wciąż dobry wybór — szczegóły w artykule o wydajności listy.

FAQ

Czy Sort() i OrderBy() dają ten sam wynik?
Efekt końcowy (kolejność elementów) tak, ale Sort() modyfikuje listę w miejscu i zwraca void, a OrderBy() z LINQ zwraca zupełnie nową sekwencję, zostawiając oryginał bez zmian. Wybór zależy od tego, czy chcesz zachować oryginalną kolejność gdzie indziej w kodzie.

Czy AddRange jest szybsze niż pętla z Add?
Tak, zwłaszcza dla dużej liczby elementów — AddRange może od razu obliczyć potrzebną pojemność i zaalokować pamięć raz, zamiast rozszerzać tablicę wewnętrzną wielokrotnie w trakcie pętli.

👨‍💻
Mariusz Jurczenko
Senior .NET Developer · 10+ lat doświadczenia komercyjnego

Programista .NET z doświadczeniem komercyjnym w firmach takich jak NFZ, Kamsoft, Diagnostyka, Hermes Reply Polska czy Etisoft Smart Solutions. Twórca kursów, z których skorzystało już ponad 11 000 osób w Strefie Kursów i ponad 1 000 kursantów na dev-hobby.pl.

Specjalizacja: Clean Code, Clean Architecture i uczenie programowania tak, żeby dało się je naprawdę zrozumieć — nie wykuć.

🚀 Co dalej?

Zobacz to w praktyce na wideo i pobierz darmową roadmapę, żeby ułożyć naukę w spójną ścieżkę do pierwszej pracy.

94 comments

  1. Eye-catching component of content. I simply stumbled upon your web web page and in accession capital to assert that I acquire in fact loved account your web log posts. Any method I will end up being subscribing in your feeds or also I achievements you get proper of entry to frequently quickly. Waneta Nels Cassaundra

  2. May I simply say what a relief to discover someone that actually understands what they are talking about online. You definitely realize how to bring a problem to light and make it important. More and more people have to check this out and understand this side of your story. I was surprised you are not more popular given that you certainly possess the gift. Terra Stevy Socrates

  3. Do you mind if I quote a few of your articles as long as I provide credit and sources back to your weblog? My blog site is in the exact same area of interest as yours and my visitors would definitely benefit from some of the information you present here. Please let me know if this alright with you. Thank you! Fran Halsey Barclay

  4. Witam. Znalazłem Twoją witrynę za pomocą Google, nawet gdy szukałem podobnej sprawy, Twoja witryna pojawiła się. Wygląda dobrze. Dodałem go do zakładek w moich zakładkach Google, aby go odwiedzić.

  5. Po przejrzeniu kilku artykułów na Twoim blogu, bardzo podoba mi się Twoja technika pisania bloga. Dodałem to do zakładek do mojej listy stron z zakładkami i będę sprawdzać w najbliższej przyszłości. Zonnya Saxe Erfert

Dodaj komentarz

czytanie to początek

Zamień wiedzę w umiejętności

Pobierz darmową Roadmapę .NET i ułóż takie tematy jak ten w spójną ścieżkę do pierwszej pracy.

Pobieram roadmapę →