Pętla foreach w C# – Jak Efektywnie Iterować przez Kolekcje

Pętla foreach w C#

Pętla foreach to jeden z najbardziej użytecznych i popularnych mechanizmów w C# do iterowania przez kolekcje danych. W tym artykule dowiesz się, jak prawidłowo używać pętli foreach oraz poznasz jej zalety w porównaniu z innymi metodami iteracji.

Co to jest pętla foreach?

Pętla foreach to specjalna konstrukcja w C#, która umożliwia łatwe przechodzenie przez wszystkie elementy w kolekcji, takiej jak tablica, lista czy inna struktura implementująca interfejs IEnumerable. Jest to bezpieczniejsza i bardziej czytelna alternatywa dla tradycyjnych pętli for czy while.

Składnia pętli foreach

Podstawowa składnia pętli foreach wygląda następująco:

foreach (typ_zmiennej nazwa_zmiennej in kolekcja)
{
    // kod do wykonania dla każdego elementu
}

Praktyczny przykład – iteracja przez tablicę miesięcy

Bardzo częstym zadaniem związanym z kolekcjami jest to, że potrzebujemy zrobić coś z każdym elementem w kolekcji po kolei.  Na Przykład z tablicą chcemy wymienić wszystkie miesiące roku w kolejności.
Mamy tablicę miesięcy w roku.

string[] monthsOfYear = { 
                "January", 
                "February", 
                "March", 
                "April", 
                "May", 
                "June", 
                "July", 
                "August", 
                "September", 
                "October", 
                "November", 
                "December" 
            }; 

I teraz, aby wyświetlić wszystkie miesiące. Użyjemy pętli foreach !
Instrukcja foreach pozwala na przejście przez wszystkie elementy tablicy albo innej kolekcji, umożliwiając dostęp do każdego elementu.

foreach (var month in monthsOfYear) 
{ 
    Console.WriteLine(month); 
}   

Foreach to najprostszy sposób na przegladanie każdego elementu w kolekcji. Mówię dosłownie dla każdego miesiąca z wszyskich miesięcy w roku, a potem mamy instrukcje w nawiasach klamrowych.

I co się stanie, stanie się tak, że kod weźmie kolejno każdy element w naszej tablicy. Ustawi tę zmienną miesiac na równą temu elementowi, a następnie wykona wszystko, co jest w pętli. To jest dowolna instrukcja lub blok instrukcji.

W naszym przypadku pętla zostanie wykonana raz z miesiącem równym, pierwszemu elementowi w tablicy – styczeń, następnie wykona się z miesiącem równym drugiemu elementowi tablicy – luty, następnie wykona się z miesiącem równym trzeciemu elementowi tablicy – marzec i tak dalej, aż przejdzie przez wszystko w tablicy.

W tym przypadku w pętli jest po prostu polecenie wypisania elementu do konsoli, ale oczywiście możesz umieścić dowolny kod, aby przetworzyć element, co tylko chcesz. Nie musi to obejmować wyświetlania elementów.

W powyższym przykładzie:

  • string to typ elementów w kolekcji
  • month to zmienna tymczasowa reprezentująca aktualny element
  • monthsOfYear to kolekcja, przez którą iterujemy

Jak działa pętla foreach?

Mechanizm działania pętli foreach jest następujący:

  1. Pętla pobiera pierwszy element z kolekcji
  2. Przypisuje go do zmiennej tymczasowej (month w naszym przykładzie)
  3. Wykonuje kod wewnątrz bloku pętli
  4. Przechodzi do następnego elementu i powtarza proces
  5. Kończy działanie po przetworzeniu wszystkich elementów

Użycie słowa kluczowego var

Możesz również użyć słowa kluczowego var zamiast jawnego określenia typu:

foreach (var month in monthsOfYear) 
{ 
    Console.WriteLine(month); 
}

Kompilator automatycznie wywnioskuje typ zmiennej na podstawie typu elementów w kolekcji.

Foreach z różnymi typami danych

Pętla foreach działa z dowolnymi typami danych. Oto przykłady z różnymi typami kolekcji:

Tablica liczb całkowitych

int[] numbers = { 4, 7, 24, 88 };

foreach (int number in numbers)
{
    Console.WriteLine($"Liczba: {number}");
}

Tablica znaków

char[] characters = { 'd', 'z', 'm', '5' };

foreach (char character in characters)
{
    Console.WriteLine($"Znak: {character}");
}

Tablica obiektów złożonych

System.Drawing.Rectangle[] rectangles = 
{ 
    new System.Drawing.Rectangle(10, 10, 50, 50), 
    new System.Drawing.Rectangle(30, 10, 50, 50), 
    new System.Drawing.Rectangle(20, 100, 100, 50), 
};

foreach (var rectangle in rectangles)
{
    Console.WriteLine($"Prostokąt: X={rectangle.X}, Y={rectangle.Y}, Width={rectangle.Width}, Height={rectangle.Height}");
}

Zalety pętli foreach

1. Czytelność kodu

Pętla foreach jest bardziej czytelna i intuicyjna niż tradycyjne pętle for:

// Pętla for - mniej czytelna
for (int i = 0; i < monthsOfYear.Length; i++)
{
    Console.WriteLine(monthsOfYear[i]);
}

// Pętla foreach - bardziej czytelna
foreach (string month in monthsOfYear)
{
    Console.WriteLine(month);
}

2. Bezpieczeństwo

Pętla foreach eliminuje ryzyko błędów związanych z indeksami (np. IndexOutOfRangeException).

3. Uniwersalność

Działa z dowolnymi kolekcjami implementującymi IEnumerable<T> – tablicami, listami, słownikami itp.

Ograniczenia pętli foreach

Brak dostępu do indeksu

Jeśli potrzebujesz dostępu do indeksu elementu, możesz użyć LINQ:

foreach (var (month, index) in monthsOfYear.Select((value, index) => (value, index)))
{
    Console.WriteLine($"{index + 1}. {month}");
}

Tylko do odczytu

W pętli foreach nie można modyfikować struktury kolekcji (dodawać/usuwać elementy), ale można modyfikować właściwości elementów (jeśli są to typy referencyjne).

Foreach z kolekcjami generycznymi

Pętla foreach doskonale współpracuje z kolekcjami generycznymi:

List<string> cities = new List<string> { "Warszawa", "Kraków", "Gdańsk", "Wrocław" };

foreach (string city in cities)
{
    Console.WriteLine($"Miasto: {city}");
}

Dobre praktyki

  1. Używaj znaczących nazw zmiennych – zamiast item użyj month, number, city itp.
  2. Preferuj foreach nad for gdy nie potrzebujesz indeksu
  3. Używaj var gdy typ jest oczywisty z kontekstu
  4. Unikaj modyfikacji kolekcji podczas iteracji

Podsumowanie

Pętla foreach to potężne i elastyczne narzędzie do iterowania przez kolekcje w C#. Jej prostota, czytelność i bezpieczeństwo czynią ją idealnym wyborem w większości scenariuszy, gdzie potrzebujemy przetworzyć wszystkie elementy kolekcji. Niezależnie od typu danych – czy są to liczby, ciągi znaków, czy złożone obiekty – pętla foreach zapewnia spójny i intuicyjny sposób na pracę z kolekcjami.

Pętla foreach działa w ten sam sposób, bez względu na typ w kolekcji.

To dopiero początek. W kursie przeprowadzę Cię przez esencję kolekcji w C# — od klasycznej tablicy, przez elastyczną listę, aż po sprytne struktury jak stos, kolejka i słownik. Nie tylko pokażę Ci jak ich używać, ale co ważniejsze — kiedy. Bo dobór kolekcji to nie przypadek, to świadoma decyzja architekta. Chcesz pisać kod, który nie tylko działa, ale ma klasę? Wskakuj do kursu.

1 comment

  1. Krytykuj przyjaciela w cztery oczy, a chwal zawsze przy świadkach i podwładnych. Leonardo da Vinci & Tm.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *