Array vs List

Array vs List w C# – kiedy używać której kolekcji?

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:

  1. tworzona jest nowa tablica (2x większa)
  2. stare dane są kopiowane
  3. 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

CechaArrayList<T>
RozmiarStałyDynamiczny
DostępO(1)O(1)
DodawanieO(1)*
PamięćMinimalnaOverhead
MetodyBrakWiele

* 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ż


🚀 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!!!

Kontakt: mariuszjurczenko@dev-hobby.pl
Zero spamu. Możesz wypisać się w każdej chwili.

Dodaj komentarz