• C# i .NET
  • Długość listy w C# - Count, Length czy Capacity?

Długość listy w C# - Count, Length czy Capacity?

Radosław Krajewski 16 sierpnia 2026
Kod C# demonstrujący różnicę między Capacity a Count w List. Po dodaniu elementów, c# list length (Count) rośnie, ale Capacity pozostaje stałe.

Spis treści

Gdy pracujesz z kolekcją danych, szybko pojawia się potrzeba sprawdzenia, ile elementów faktycznie zawiera lista. W C# odpowiedź jest prosta, ale łatwo pomylić Count z Length, Capacity albo metodą LINQ Count(). Pokażę praktyczne rozwiązania, różnice między nimi oraz sytuacje, w których każde z nich ma sens.

Jedna właściwość wystarcza w większości przypadków

  • list.Count zwraca liczbę elementów zapisanych w List.
  • Length stosuje się do tablic i tekstów, a nie do list generycznych.
  • Capacity oznacza zarezerwowane miejsce, nie rzeczywistą liczbę elementów.
  • Count() z LINQ przydaje się dla dowolnego IEnumerable, ale dla List lepiej użyć właściwości.
  • Pusta lista ma wartość Count równą 0, a odwołanie do Count - 1 może wtedy zakończyć się błędem.

Jak sprawdzić długość listy w C#

W przypadku List liczbę elementów odczytuje się przez właściwość Count. To podstawowa odpowiedź na pytanie określane często jako c# list length i rozwiązanie, które sam wybieram, gdy znam konkretny typ kolekcji.

using System;
using System.Collections.Generic;

List languages = new()
{
    "C#",
    "F#",
    "Visual Basic"
};

int numberOfLanguages = languages.Count;

Console.WriteLine(numberOfLanguages); // 3

Właściwość nie przelicza elementów od początku przy każdym odczycie. Lista przechowuje aktualną liczbę elementów, dlatego Count jest szybkie i czytelne. Dodanie elementu przez Add zwiększa wynik o jeden, a usunięcie przez Remove lub RemoveAt go zmniejsza.

var numbers = new List { 10, 20 };

Console.WriteLine(numbers.Count); // 2

numbers.Add(30);
Console.WriteLine(numbers.Count); // 3

numbers.Remove(20);
Console.WriteLine(numbers.Count); // 2

numbers.Clear();
Console.WriteLine(numbers.Count); // 0

Count, Length i Capacity oznaczają coś innego

Najczęstsza pomyłka wynika z przenoszenia przyzwyczajeń z tablic na listy. Tablica ma właściwość Length, natomiast List używa Count. Oba wyniki opisują liczbę elementów, ale dotyczą różnych typów danych.

Typ danych Właściwość lub metoda Znaczenie
List Count Liczba elementów znajdujących się na liście
Tablica Length Liczba elementów tablicy
string Length Liczba znaków w tekście
List Capacity Liczba elementów, które lista może pomieścić bez realokacji
var list = new List { 1, 2, 3 };
int[] array = { 1, 2, 3 };

Console.WriteLine(list.Count);   // 3
Console.WriteLine(array.Length); // 3

Capacity nie odpowiada na pytanie, ile danych znajduje się na liście. Przykładowo lista może mieć Count = 3 i Capacity = 8. Osiem to tylko rozmiar wewnętrznego bufora, który pozwala dodawać kolejne elementy bez natychmiastowego powiększania tablicy pomocniczej.

W praktyce nie używam Capacity do wyświetlania liczby rekordów ani do sprawdzania, czy kolekcja jest pusta. Ta właściwość ma znaczenie głównie przy optymalizacji pamięci i wydajności podczas dodawania dużej liczby elementów.

Kod C# demonstrujący różnicę między Capacity a Count w List<int>. Po dodaniu elementów, c# list length (Count) rośnie, ale Capacity pozostaje stałe.

Kiedy użyć metody Count z LINQ

Metoda Count() pochodzi z LINQ i działa na typie IEnumerable. Przydaje się, gdy zmienna nie jest konkretną listą, lecz wynikiem zapytania, generatorem danych albo inną kolekcją udostępniającą tylko możliwość iterowania.

using System.Linq;

IEnumerable values = GetValues();

int total = values.Count();

static IEnumerable GetValues()
{
    yield return 4;
    yield return 8;
    yield return 15;
}

Dla zwykłego List preferuję jednak list.Count zamiast list.Count(). Właściwość jest bardziej bezpośrednia i jasno pokazuje, że odczytujemy stan listy. Metoda LINQ może skorzystać z właściwości licznika, jeśli kolekcja ją udostępnia, ale przy ogólnym IEnumerable może też przejść przez wszystkie elementy.

Count() jest szczególnie wygodne przy liczeniu elementów spełniających warunek. Wtedy nie zastępuje go samo Count, ponieważ właściwość zna tylko całkowity rozmiar listy.

var numbers = new List { 3, 6, 9, 10, 12 };

int evenNumbers = numbers.Count(number => number % 2 == 0);

Console.WriteLine(evenNumbers); // 3

Jeżeli chcesz wyłącznie sprawdzić, czy istnieje choć jeden pasujący element, lepiej użyć Any() niż Count() > 0. Any() może zakończyć działanie natychmiast po znalezieniu pierwszego wyniku.

bool containsEvenNumber = numbers.Any(number => number % 2 == 0);

Jak bezpiecznie sprawdzić, czy lista jest pusta

Najprostszy warunek wygląda tak:

if (items.Count == 0)
{
    Console.WriteLine("Lista nie zawiera elementów.");
}

Możesz też zapisać warunek odwrotny jako items.Count > 0. W przypadku listy jest to czytelne i nie wymaga uruchamiania zapytania LINQ.

Jeśli pracujesz z interfejsem IEnumerable, użyj raczej Any():

if (!items.Any())
{
    Console.WriteLine("Brak danych.");
}

Trzeba też odróżnić pustą listę od wartości null. Pusta lista istnieje, ale ma zero elementów. Zmienna o wartości null nie wskazuje na żadną listę, więc bezpośrednie wywołanie items.Count zakończy się wyjątkiem NullReferenceException.

List? items = GetItems();

int count = items?.Count ?? 0;

Zapis z operatorem ?. traktuje brak listy jak brak elementów. To dobre rozwiązanie tylko wtedy, gdy taka interpretacja ma sens w logice aplikacji. W systemie biznesowym null może oznaczać błąd danych, a nie zwyczajnie pusty wynik.

Count a indeks ostatniego elementu

Lista korzysta z indeksów zaczynających się od zera. Z tego powodu liczba elementów i indeks ostatniego elementu to dwie różne wartości. Dla listy zawierającej trzy elementy Count wynosi 3, ale ostatni poprawny indeks to 2.

var colors = new List { "czerwony", "zielony", "niebieski" };

string lastColor = colors[colors.Count - 1];

Console.WriteLine(lastColor); // niebieski

Wyrażenie Count - 1 jest bezpieczne tylko wtedy, gdy lista nie jest pusta. Przy Count == 0 otrzymasz indeks -1, a próba odczytu elementu zakończy się wyjątkiem ArgumentOutOfRangeException.

if (colors.Count > 0)
{
    Console.WriteLine(colors[^1]);
}

Operator indeksu ^1 oznacza pierwszy element od końca. Jest wygodniejszy niż Count - 1, ale nie zmienia podstawowej zasady: przed odczytem ostatniego elementu trzeba upewnić się, że lista coś zawiera.

Co naprawdę warto zapamiętać przy pracy z listami

Jeżeli masz zmienną typu List, sięgnij po Count. Nie używaj Capacity jako zamiennika i nie próbuj stosować Length, bo ta właściwość dotyczy tablic oraz tekstów.

Gdy kolekcja jest opisana szerzej jako IEnumerable, wybierz Count() do policzenia wszystkich elementów albo Any() do sprawdzenia, czy istnieje choć jeden. To drobna różnica w kodzie, ale poprawia czytelność i może ograniczyć niepotrzebne przechodzenie przez dane.

Najważniejsza praktyczna reguła jest prosta: liczbę elementów listy odczytuj przez list.Count, a o Capacity, Length i LINQ myśl jako o narzędziach przeznaczonych do innych sytuacji.

FAQ - Najczęstsze pytania

Użyj właściwości Count, na przykład list.Count. Zwraca ona aktualną liczbę elementów, więc po dodaniu, usunięciu lub wyczyszczeniu listy wynik odpowiednio się zmienia.

Count określa liczbę elementów w List<T>, a Length służy do tablic i tekstów. Capacity oznacza rozmiar zarezerwowanego bufora, dlatego lista może mieć na przykład Count = 3 i Capacity = 8.

Dla konkretnego typu List<T> wybierz właściwość Count. Metoda LINQ Count() jest przydatna przy zmiennej typu IEnumerable<T> oraz wtedy, gdy chcesz policzyć elementy spełniające warunek.

Dla List<T> użyj warunku items.Count > 0 albo items.Count == 0. Dla IEnumerable<T> lepszym wyborem jest Any(), które może zakończyć działanie po znalezieniu pierwszego elementu.

Najpierw sprawdź, czy Count > 0, a następnie użyj colors[^1] lub colors[colors.Count - 1]. Przy pustej liście indeks Count - 1 wynosi -1 i powoduje ArgumentOutOfRangeException.

Oceń artykuł

Ocena: 0.00 Liczba głosów: 0

Tagi

linq
tablice
indeksowanie
wydajność
list<t>
Autor Radosław Krajewski
Radosław Krajewski
Nazywam się Radosław Krajewski i od 6 lat zgłębiam tajniki programowania .NET, chmury Azure oraz sztucznej inteligencji. Moja przygoda z tymi technologiami zaczęła się od fascynacji tym, jak złożone problemy można rozwiązywać za pomocą kodu i innowacyjnych narzędzi. Staram się przekazywać tę wiedzę w sposób zrozumiały, dzieląc się swoimi doświadczeniami i spostrzeżeniami na kursdotnet.pl. W moich artykułach skupiam się na praktycznych aspektach, porównuję różne rozwiązania i analizuję najnowsze trendy, aby dostarczyć Wam rzetelne i aktualne informacje, które pomogą Wam rozwijać się w tej dynamicznie zmieniającej się dziedzinie.

Udostępnij artykuł

Napisz komentarz