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.Countzwraca liczbę elementów zapisanych wList. -
Lengthstosuje się do tablic i tekstów, a nie do list generycznych. -
Capacityoznacza zarezerwowane miejsce, nie rzeczywistą liczbę elementów. -
Count()z LINQ przydaje się dla dowolnegoIEnumerable, ale dlaListlepiej użyć właściwości. -
Pusta lista ma wartość
Countrówną0, a odwołanie doCount - 1moż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.

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.
