W programowaniu nie raz zdaży się, że będziecie potrzebowali wielokrotnie wykonać dany blok kodu. W największym skrócie, pętle takie wykonywane są sekwencyjnie, tj. zaczynamy od pierwszej linii kodu w danym bloku, przechodzimy do drugiej, następnej i tak do końca.

Język C# dostarcza różne pętle, które pozwalają na wielokrotne wykonywanie danego bloku kodu.

Pętle takie pozwalają na wielokrotne wykonanie pojedynczych albo całych grup poleceń. Poniżej zostaną omówione pętle wraz z opisem, składnią oraz przykładami, które lepiej pozwolą zrozumieć istotne różnice pomiędzy wymienionymi konstrukcjami.

Pętla while

Pętla while wykonywana jest wielokrotnie, tak długo jak prawdziwy jest zdefiniowany warunek.
Składnia:
while(warunek)
{
	zbior_polecen();
}
W powyższym przykładzie zbior_polecen() może być pojedynczym poleceniem lub blokiem instrukcji do wykonania. Możemy zdefiniować dowolny warunek a pętla będzie wykonywana dopóki będzie on prawdziwy.

Gdy warunek stanie się fałszywy program automatycznie przejdzie do pierwszej linii kodu bezpośrednio po pętli while.
Przykład:
// Pętla while
int a = 10;
while(a<=20)
{
    Console.WriteLine("Liczba to: {0}", a);
    // Operator inkrementacji, wartość zostaje zwiększona o jeden
    a++;
}
Console.ReadKey();
// Wyniki działania programu jest następujący:
//Liczba to: 10
//Liczba to: 11
//Liczba to: 12
//Liczba to: 13
//Liczba to: 14
//Liczba to: 15
//Liczba to: 16
//Liczba to: 17
//Liczba to: 18
//Liczba to: 19
//Liczba to: 20

Pętla for

Pętla for jest strukturą pozwalającą na definicje pętli, która musi wykonać się określoną ilość razy.
Składnia:
for(inicjalizacja; warunek; inkrementacja)
{
    zbior_polecen();
}
Kolejne kroki w pętli for:
  • krok inicjalizacji wykonywany jest w pierwszej kolejności, oraz co ważne, wykonywany jest tylko raz. Krok ten pozwala na zdeklarowanie zmiennej, która steruje działaniem pętli. Miejsce to może również pozostać puste, o ile pojawi się znak średnika;
  • kolejny krok to warunek. Jeżeli jest prawdziwy blok kodu wewnątrz pętli zostanie wykonany. Jeżeli nie, program automatycznie przejdzie do pierwszej linii kodu bezpośrednio po pętli for;
  • po wykonaniu bloku kodu dochodzi do powrotu do miejsca inkrementacji. W tym miejscu możemy dokonać aktualizacji wartości, po której iterujemy. Miejsce to może również pozostać puste, o ile pojawi się znak średnika;
  • w tym miejscu nasz warunek jest sprawdzany ponownie. Jeżeli jest poprawny blok kodu zostaje ponownie wykonany (blok kodu wewnątrz pęli, potem ponownie dochodzi do aktualizacji wartości inkrementacji, a następnie do ponownego sprawdzenia warunku). Pętla będzie wykonywana dopóki warunek będzie prawdziwy.
Przykład:
// Pętla for
for (int i = 0; i <= 5; i++)
{
    Console.WriteLine("Liczba to: {0}", i);
}
Console.ReadKey();
// Wynik działania programu jest następujący:
//Liczba to: 0
//Liczba to: 1
//Liczba to: 2
//Liczba to: 3
//Liczba to: 4
//Liczba to: 5

Pętla do…while

W przeciwieństwie do pętli while, która sprawdza warunek na początku, pętla do…while sprawdza warunek na końcu pętli.

Obie pętle są do siebie podobne, z tym, że w przypadku pętli do…while mamy gwarancje, że zostanie ona wykonana co najmniej jeden raz.
Składnia:
do
{
	zbior_polecen();
}
while(warunek)
Warto zwrócić uwagę, że wyrażenie warunkowe znajduje się na końcu pętli, dzięki czemu wiemy, że zbior_polecen() powinien zostać wykonany raz zanim dojdzie do sprawdzenia warunku.

Jeżeli warunek jest prawdziwy dojdzie do powrotu do pierwszej linii naszej pętli, tj. polecenia do oraz do ponownego wykonania zbior_polecen(). Proces ten będzie powtarzany tak długo, jak długo warunek będzie prawdziwy.
Przykład:
// Pętla do...while
int i = 3;
do
{
    Console.WriteLine("Liczba to: {0}", i);
    i++;
}
while (i < 10);
// Wynik działania programu jest następujący:
//Liczba to: 3
//Liczba to: 4
//Liczba to: 5
//Liczba to: 6
//Liczba to: 7
//Liczba to: 8
//Liczba to: 9

Zagnieżdzone pętle

W języku C# mamy możliwość używania jednej pętli w środku drugiej. Poniżej przykłady użycia takich pętli.
Składnia dla pętli for:
for(inicjalizacja_1; warunek_1; inkrementacja_1)
{
    for(inicjalizacja_2; warunek_2; inkrementacja_2)
    {
        zbior_polecen();
    }
    zbior_polecen();
}
Składnia dla pętli do…while:
do
{
	zbior_polecen();
    do
    {
	    zbior_polecen();
    }
    while(warunek_2)
}
while(warunek_1)
Składnia dla pętli while:
while(warunek_1)
{
    while(warunek_2)
    {
	    zbior_polecen();
    }
    zbior_polecen();
}
Podsumowując, warto pamiętać, że każdy rodzaj pętli może zostać umieszczony wewnątrz innej pętli. Nie ma tutaj żadnych ograniczen.

Przykład:
// Zagnieżdzone pętle for
for (int l1 = 0; l1 < 5; l1++)
{
    for (int l2 = 2; l2 > 0; l2--)
    {
        Console.WriteLine("Liczba l1 to: {0}, Liczba l2 to : {1}", l1, l2);
    }
}
Console.ReadKey();
// Wynik działania programu jest następujący
//Liczba l1 to: 0, Liczba l2 to : 2
//Liczba l1 to: 0, Liczba l2 to : 1
//Liczba l1 to: 1, Liczba l2 to : 2
//Liczba l1 to: 1, Liczba l2 to : 1
//Liczba l1 to: 2, Liczba l2 to : 2
//Liczba l1 to: 2, Liczba l2 to : 1
//Liczba l1 to: 3, Liczba l2 to : 2
//Liczba l1 to: 3, Liczba l2 to : 1
//Liczba l1 to: 4, Liczba l2 to : 2
//Liczba l1 to: 4, Liczba l2 to : 1

Polecenie break

Wykonywanie pętli może zostać przerwane na żądanie. Jednym z takich sposobów jest użycie polecenia break. W momencie warunkowego opuszczania pętli dochodzi do automatycznego usunięcia wszystkich obiektów utworzony wewnątrz pętli. Polecenie break jest używane do:
  • natychmiastowego zakończenia pętli;
  • zakończenia wykonywania instrukcji wyboru.
Przykład:
for (int i = 0; i < 20; i++)
{
    // Przerwanie wykonywania pętli gdy liczba jest większa niż 5
    if (i > 5)
        break;
}

Polecenie continue

Polecenie continue jest w pewnym sensie podobne do działania polecenia break. Jednakże, zamiast przerywania wykonywania pętli dochodzi do wymuszonego przejścia do kolejnej iteracji.
Przykład:
for (int i = 0; i < 5; i++)
{
    // Jeżeli liczba wyniesie 3 przejdziemy do wykonania kolejnej iteracji
    // kod obecnej iteracji zostanie pominięty
    if (i == 3)
        continue;
    Console.WriteLine("Liczba i wynosi: {0}", i);
}
// Wynik działania programu
//Liczba i wynosi: 0
//Liczba i wynosi: 1
//Liczba i wynosi: 2
//Liczba i wynosi: 4