Array vs List w C# – kiedy używać której kolekcji?
Array vs List w C# to jedno z najczęstszych pytań na rozmowach rekrutacyjnych – ale też jeden z najczęściej źle rozumianych tematów w praktyce.
Większość developerów mówi:
👉 Array ma stały rozmiar, List dynamiczny
To prawda… ale tylko częściowo.
W tym artykule pokażę Ci:
- jak te kolekcje działają w pamięci
- jakie mają realne różnice wydajnościowe
- oraz kiedy używać której w kodzie produkcyjnym

⚙️ Jak działa Array w C#?
📌 Ciągły blok pamięci = maksymalna wydajność
Array (int[]) to najprostsza i najszybsza struktura danych.
int[] numbers = new int[5];
👉 Co się dzieje pod spodem?
- rezerwowany jest ciągły blok pamięci
- każdy element ma przewidywalny adres
- dostęp do elementu to operacja O(1)

🧠 Dlaczego to jest szybkie?
Adres elementu liczony jest bezpośrednio:
adres = start + (index * size)
Dzięki temu:
- brak dodatkowych operacji
- brak alokacji
- brak kopiowania
✅ Kiedy używać Array?
Użyj Array, gdy:
- ✔ znasz rozmiar z góry
- ✔ zależy Ci na maksymalnej wydajności
- ✔ dane są stałe (immutable / readonly)
Przykłady:
- przetwarzanie obrazu (piksele)
- bufory danych
- operacje matematyczne
🚀 Jak działa List<T> w C#?
📌 List to… tablica z “inteligencją”
var list = new List<int>();
Pod spodem:
- List używa tablicy
- ma dodatkowe pola:
Count,Capacity, Add…
⚠️ Co się dzieje przy resize?
Gdy przekroczysz Capacity:
- tworzona jest nowa tablica (2x większa)
- stare dane są kopiowane
- stara tablica jest usuwana

📊 Przykład:
var list = new List<int>();
for (int i = 0; i < 5; i++)
{
list.Add(i);
}
👉 W pewnym momencie:
- następuje alokacja nowej pamięci
- kopiowanie wszystkich elementów
✅ Kiedy używać List<T>?
Użyj List, gdy:
- ✔ nie znasz liczby elementów
- ✔ dodajesz/usuwasz dane dynamicznie
- ✔ potrzebujesz metod (
Add,Remove,Contains)
⚔️ Array vs List – kluczowe różnice
📊 Szybkie porównanie
| Cecha | Array | List<T> |
| Rozmiar | Stały | Dynamiczny |
| Dostęp | O(1) | O(1) |
| Dodawanie | ❌ | O(1)* |
| Pamięć | Minimalna | Overhead |
| Metody | Brak | Wiele |
* amortyzowane O(1)

🧪 Performance – co jest szybsze?
📌 Benchmark (100k elementów)
🔹 Array
var sw = Stopwatch.StartNew();
sw.Restart();
var array = new int[100_000];
for (int i = 0; i < ELEMENTS; i++)
{
array[i] = i;
}
sw.Stop();
Console.WriteLine($"Array: {sw.ElapsedMilliseconds} ms");
🔹 List (bez capacity)
sw.Restart();
var list = new List<int>();
for (int i = 0; i < 100_000; i++)
{
list.Add(i);
}
sw.Stop();
Console.WriteLine($"List.Add(): {sw.ElapsedMilliseconds} ms");
🔹 List (z capacity)
sw.Restart();
var listWithCapacity = new List<int>(ELEMENTS);
for (int i = 0; i < ELEMENTS; i++)
{
listWithCapacity.Add(i);
}
sw.Stop();
Console.WriteLine($"List (Capacity): {sw.ElapsedMilliseconds} ms");
🏆 Wnioski:
- 🥇 Array – najszybsza (brak resize)
- 🥈 List z Capacity – prawie tak szybka
- 🥉 List bez Capacity – najwolniejsza
🎯 PRO TIP – unikaj kosztów List
Jeśli znasz przybliżony rozmiar:
var list = new List<int>(expectedSize);
👉 unikasz:
- wielokrotnej alokacji
- kopiowania danych
❌ Najczęstsze błędy developerów
🚨 Błąd #1: Contains w pętli
// ❌ O(n²)
foreach (var item in items)
{
if (!list.Contains(item))
{
list.Add(item);
}
}
✅ Poprawnie:
var set = new HashSet<int>(items);
🚨 Błąd #2: RemoveAt(0)
list.RemoveAt(0); // ❌ O(n)
👉 przesuwa całą tablicę
✅ Lepsze rozwiązanie:
var queue = new Queue<int>();
queue.Dequeue(); // O(1)
🚨 Błąd #3: brak Capacity
var list = new List<int>(); // ❌
✅ Lepsze rozwiązanie:
var list = new List<int>(10000);
🧠 Jak dobrać kolekcję? (Decision Tree)
📌 Szybka decyzja:
- Znasz rozmiar?
- ✔ TAK → Array
- ❌ NIE → List
- Performance krytyczny?
- ✔ TAK → Array / List z Capacity
🔗 Zobacz też
- C# Podstawy Programowania: Twój Pierwszy Krok w Świat Kodowania
- AI w .NET: Zostań Architektem Inteligentnych Aplikacji!
- C# Clean Architecture w Praktyce
- C# – Zbuduj Własnego Tetrisa! Kompletny Przewodnik
- 7 Dniowe Wyzwanie C# Tic Tac Toe
- C# Zbuduj Profesjonalny Portal Randkowy od Podstaw!
🚀 Podsumowanie
Najważniejsze:
- Array = maksymalna wydajność
- List = elastyczność
- List = nadal tablica pod spodem
- Capacity ma ogromne znaczenie
👉 Wybór kolekcji to decyzja architektoniczna, nie składniowa
📣 Call To Action
💬 Napisz w komentarzu:
Czego używasz częściej – Array czy List?
📩 Chcesz więcej takich materiałów?
Napisz w komentarzu
👉 subskrybuj nasz kanał na YT!
👉 udostępnij artykuł komuś, kto zaczyna z programowaniem
Zobacz także — powiązane artykuły
👉 MCP w .NET (C#) – jak zbudować serwer AI krok po kroku
👉 Tworzenie klas i obiektów w C# — kompletny przewodnik
👉 Pattern Matching w C# – switch expressions i type patterns
Dołącz do Listy VIP
I otrzymaj roadmapę Junior .NET Developer oraz najlepszą ofertę, gdy tylko ruszą zapisy!!!

