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:
stringto typ elementów w kolekcjimonthto zmienna tymczasowa reprezentująca aktualny elementmonthsOfYearto kolekcja, przez którą iterujemy
Jak działa pętla foreach?
Mechanizm działania pętli foreach jest następujący:
- Pętla pobiera pierwszy element z kolekcji
 - Przypisuje go do zmiennej tymczasowej (
monthw naszym przykładzie) - Wykonuje kod wewnątrz bloku pętli
 - Przechodzi do następnego elementu i powtarza proces
 - 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
- Używaj znaczących nazw zmiennych – zamiast 
itemużyjmonth,number,cityitp. - Preferuj 
foreachnadforgdy nie potrzebujesz indeksu - Używaj 
vargdy typ jest oczywisty z kontekstu - 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.



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