Wird geladen...

C# Schleifen (for, foreach, while, do-while)

Lernen Sie die Verwendung von for-, foreach-, while- und do-while-Schleifen in C#, um wiederholte Abläufe effizient umzusetzen.

In C# ermöglichen Schleifen, denselben Codeblock wiederholt auszuführen, solange eine bestimmte Bedingung wahr ist. Sie sparen Zeit und machen es einfach, wiederkehrende Aufgaben zu erledigen. Die am häufigsten verwendeten Schleifen in C# sind: for, foreach, while und do-while.


for-Schleife

Die for-Schleife wird in der Regel verwendet, wenn die Anzahl der Wiederholungen bekannt ist. Sie wird mit einer Zählervariablen gesteuert.

Vorwärts zählen: Der Zähler i wird jedes Mal um 1 erhöht. Die Schleife endet, bevor er 5 erreicht.


for (int i = 0; i < 5; i++)
{
    Console.WriteLine("Schritt: " + i);
}
// Ausgabe:
Schritt: 0
Schritt: 1
Schritt: 2
Schritt: 3
Schritt: 4

Rückwärts zählen: Der Zähler i wird jedes Mal um 1 verringert. Die Schleife endet, bevor er 0 erreicht.


for (int i = 5; i > 0; i--)
{
    Console.WriteLine("Countdown: " + i);
}
// Ausgabe:
Countdown: 5
Countdown: 4
Countdown: 3
Countdown: 2
Countdown: 1

In Schritten von 5 erhöhen: Der Zähler i wird jedes Mal um 5 erhöht. Die Schleife endet, wenn er 25 erreicht.


for (int i = 0; i <= 25; i += 5)
{
    Console.WriteLine("Zahl: " + i);
}
// Ausgabe:
Zahl: 0
Zahl: 5
Zahl: 10
Zahl: 15
Zahl: 20
Zahl: 25

Verschachtelte for-Schleife: Mit verschachtelten Zählern i und j, die jeweils bis 3 zählen, gibt das Programm ihre Produkte aus.


for (int i = 1; i <= 3; i++)
{
    for (int j = 1; j <= 3; j++)
    {
        Console.Write($"{i * j}\t");
    }
    Console.WriteLine();
}
// Ausgabe:
1    2    3
2    4    6
3    6    9

break und continue

Manchmal werden in Schleifen die Schlüsselwörter break und continue verwendet, um den Ablauf zu steuern.

break: Beendet die Schleife vollständig.


for (int i = 1; i <= 5; i++)
{
    if (i == 3)
        break; // wenn i gleich 3 ist, endet die Schleife

    Console.WriteLine("i: " + i);
}
// Ausgabe:
i: 1
i: 2

continue: Überspringt nur die aktuelle Iteration, der Rest der Schleife wird fortgesetzt.


for (int i = 1; i <= 5; i++)
{
    if (i == 3)
        continue; // wenn i gleich 3 ist, wird dieser Schritt übersprungen

    Console.WriteLine("i: " + i);
}
// Ausgabe:
i: 1
i: 2
i: 4
i: 5

foreach-Schleife

Die foreach-Schleife wird verwendet, um über Sammlungen (Array, Liste usw.) zu iterieren. Die Anzahl der Elemente muss nicht bekannt sein.


string[] früchte = { "Apfel", "Birne", "Banane" };

foreach (string frucht in früchte)
{
    Console.WriteLine(frucht);
}

In diesem Beispiel wird jedes Element des Arrays früchte der Reihe nach ausgegeben.


while-Schleife

Die while-Schleife wiederholt sich, solange die Bedingung wahr ist. Die Anzahl der Wiederholungen ist möglicherweise nicht im Voraus bekannt.

Einfacher Zähler: Die Variable zahl beginnt bei 1 und wird bis 3 ausgegeben.


int zahl = 1;

while (zahl <= 3)
{
    Console.WriteLine("Zahl: " + zahl);
    zahl++;
}
// Ausgabe:
Zahl: 1
Zahl: 2
Zahl: 3

Zeichen einer Zeichenkette ausgeben: In diesem Beispiel gibt eine while-Schleife jedes Zeichen eines Textes aus. Wenn ein Leerzeichen gefunden wird, wird es mit continue übersprungen. Wenn ein Punkt (.) gefunden wird, endet die Schleife mit break.


string text = "Heute ist das Wetter schön. Gehen wir raus.";
int index = 0;

while (index < text.Length)
{
    char c = text[index];

    if (c == ' ')
    {
        index++;
        continue; // Leerzeichen überspringen
    }

    if (c == '.')
        break; // Schleife beenden, wenn ein Punkt gefunden wird

    Console.WriteLine(c);
    index++;
}
// Ausgabe:
H
e
u
t
e
i
s
t
d
a
s
W
e
t
t
e
r
s
c
h
ö
n

Unendliche while(true)-Schleife: Bei unendlichen Schleifen kann man mit break abbrechen. In diesem Beispiel wird der Benutzer so lange nach einem Passwort gefragt, bis das richtige eingegeben wird.


while (true)
{
    Console.Write("Passwort eingeben: ");
    string passwort = Console.ReadLine();

    if (passwort == "1234")
    {
        Console.WriteLine("Login erfolgreich!");
        break; // richtiges Passwort eingegeben, Schleife beenden
    }

    Console.WriteLine("Falsches Passwort, bitte erneut versuchen.");
}
// Beispielausführung:
Passwort eingeben: 1111
Falsches Passwort, bitte erneut versuchen.
Passwort eingeben: 2222
Falsches Passwort, bitte erneut versuchen.
Passwort eingeben: 1234
Login erfolgreich!

do-while-Schleife

Die do-while-Schleife wird mindestens einmal ausgeführt und überprüft dann die Bedingung. Das bedeutet, dass sie mindestens einmal läuft, auch wenn die Bedingung falsch ist.

Einfaches Beispiel: Auch wenn die Bedingung am Anfang nicht erfüllt ist, wird die Schleife einmal ausgeführt.


int x = 5;

do
{
    Console.WriteLine("x-Wert: " + x);
    x++;
} while (x < 5);
// Ausgabe:
x-Wert: 5

Teiler finden: Mit einer do-while-Schleife werden die Teiler einer vom Benutzer eingegebenen Zahl gefunden.


Console.Write("Geben Sie eine Zahl ein: ");
int zahl = int.Parse(Console.ReadLine());

if (zahl <= 0)
{
    Console.WriteLine("Bitte geben Sie eine Zahl größer als 0 ein.");
}
else
{
    int teiler = zahl;

    Console.WriteLine($"Teiler von {zahl}:");

    do
    {
        if (zahl % teiler == 0)
        {
            Console.WriteLine(teiler);
        }
        teiler--;
    } while (teiler >= 1);
}
// Beispielausführung:
Geben Sie eine Zahl ein: 12
Teiler von 12:
12
6
4
3
2
1

Zusammenfassung


Anwendung: Menü- und Produktverwaltung mit Pfeiltasten

In diesem Beispiel schreiben wir ein einfaches Menü, das mit einer endlosen Schleife läuft und mit den Pfeiltasten (↑/↓) sowie Enter eine Auswahl trifft. Für 5 Produkte werden Arrays verwendet, die Name- und Preis-Informationen speichern. Menüs: Produkte anzeigen, Produkt aktualisieren, Produkt löschen, Beenden.


using System;
using System.Globalization;

class Program
{
    static void Main()
    {
        string[] produktNamen = { "Stift", "Heft", "Radiergummi", "Tasche", "Lineal" };
        decimal[] produktPreise = { 12.5m, 45m, 7.9m, 350m, 22.75m };

        string[] menu = { "Produkte anzeigen", "Produkt aktualisieren", "Produkt löschen", "Beenden" };
        int ausgewaehlt = 0;

        while (true) // Endlosschleife
        {
            Console.Clear();
            Console.WriteLine("=== Produktverwaltung ===\n");

            // Menü zeichnen
            for (int i = 0; i < menu.Length; i++)
            {
                if (i == ausgewaehlt)
                {
                    Console.ForegroundColor = ConsoleColor.Black;
                    Console.BackgroundColor = ConsoleColor.Cyan;
                    Console.WriteLine($"> {menu[i]}");
                    Console.ResetColor();
                }
                else
                {
                    Console.WriteLine($"  {menu[i]}");
                }
            }

            Console.WriteLine("\nMit den Pfeiltasten navigieren, Enter zum Auswählen, Esc zum Beenden.");

            var key = Console.ReadKey(true);

            if (key.Key == ConsoleKey.UpArrow)
                ausgewaehlt = (ausgewaehlt - 1 + menu.Length) % menu.Length;
            else if (key.Key == ConsoleKey.DownArrow)
                ausgewaehlt = (ausgewaehlt + 1) % menu.Length;
            else if (key.Key == ConsoleKey.Escape)
                break;
            else if (key.Key == ConsoleKey.Enter)
            {
                if (ausgewaehlt == 0) // Produkte anzeigen
                {
                    Console.Clear();
                    Console.WriteLine("=== Produktliste ===\n");
                    for (int i = 0; i < produktNamen.Length; i++)
                    {
                        string name = string.IsNullOrWhiteSpace(produktNamen[i]) ? "(gelöscht)" : produktNamen[i];
                        Console.WriteLine($"{i + 1}. {name,-15} | {produktPreise[i],8:0.00} EUR");
                    }
                    Console.WriteLine("\nBeliebige Taste zum Fortfahren...");
                    Console.ReadKey(true);
                }
                else if (ausgewaehlt == 1) // Produkt aktualisieren
                {
                    int index = 0;
                    while (true)
                    {
                        Console.Clear();
                        Console.WriteLine("=== Produkt zum Aktualisieren auswählen ===\n");
                        for (int i = 0; i < produktNamen.Length; i++)
                        {
                            string name = string.IsNullOrWhiteSpace(produktNamen[i]) ? "(gelöscht)" : produktNamen[i];
                            if (i == index)
                            {
                                Console.ForegroundColor = ConsoleColor.Black;
                                Console.BackgroundColor = ConsoleColor.Yellow;
                                Console.WriteLine($"> {i + 1}. {name,-15} | {produktPreise[i],8:0.00} EUR");
                                Console.ResetColor();
                            }
                            else
                            {
                                Console.WriteLine($"  {i + 1}. {name,-15} | {produktPreise[i],8:0.00} EUR");
                            }
                        }
                        Console.WriteLine("\nMit den Pfeiltasten navigieren, Enter zum Auswählen, Esc zum Zurückgehen.");
                        var k = Console.ReadKey(true);
                        if (k.Key == ConsoleKey.UpArrow) index = (index - 1 + produktNamen.Length) % produktNamen.Length;
                        else if (k.Key == ConsoleKey.DownArrow) index = (index + 1) % produktNamen.Length;
                        else if (k.Key == ConsoleKey.Escape) break;
                        else if (k.Key == ConsoleKey.Enter)
                        {
                            Console.Clear();
                            Console.WriteLine("=== Produkt aktualisieren ===\n");
                            Console.WriteLine($"Ausgewählt: {produktNamen[index]} | Alter Preis: {produktPreise[index]:0.00} EUR\n");

                            Console.Write("Neuer Name (leer lassen, um zu behalten): ");
                            string neuerName = Console.ReadLine();
                            if (!string.IsNullOrWhiteSpace(neuerName))
                                produktNamen[index] = neuerName.Trim();

                            Console.Write("Neuer Preis (leer lassen, um zu behalten): ");
                            string preisStr = Console.ReadLine();
                            if (decimal.TryParse(preisStr, NumberStyles.Any, CultureInfo.InvariantCulture, out decimal neuerPreis))
                                produktPreise[index] = Math.Max(0, neuerPreis);

                            Console.WriteLine("\nAktualisierung abgeschlossen. Beliebige Taste zum Fortfahren...");
                            Console.ReadKey(true);
                            break;
                        }
                    }
                }
                else if (ausgewaehlt == 2) // Produkt löschen
                {
                    int index = 0;
                    while (true)
                    {
                        Console.Clear();
                        Console.WriteLine("=== Produkt zum Löschen auswählen ===\n");
                        for (int i = 0; i < produktNamen.Length; i++)
                        {
                            string name = string.IsNullOrWhiteSpace(produktNamen[i]) ? "(gelöscht)" : produktNamen[i];
                            if (i == index)
                            {
                                Console.ForegroundColor = ConsoleColor.Black;
                                Console.BackgroundColor = ConsoleColor.Red;
                                Console.WriteLine($"> {i + 1}. {name,-15} | {produktPreise[i],8:0.00} EUR");
                                Console.ResetColor();
                            }
                            else
                            {
                                Console.WriteLine($"  {i + 1}. {name,-15} | {produktPreise[i],8:0.00} EUR");
                            }
                        }
                        Console.WriteLine("\nMit den Pfeiltasten navigieren, Enter zum Auswählen, Esc zum Zurückgehen.");
                        var k = Console.ReadKey(true);
                        if (k.Key == ConsoleKey.UpArrow) index = (index - 1 + produktNamen.Length) % produktNamen.Length;
                        else if (k.Key == ConsoleKey.DownArrow) index = (index + 1) % produktNamen.Length;
                        else if (k.Key == ConsoleKey.Escape) break;
                        else if (k.Key == ConsoleKey.Enter)
                        {
                            produktNamen[index] = string.Empty;
                            produktPreise[index] = 0m;
                            Console.WriteLine("\nProdukt gelöscht. Beliebige Taste zum Fortfahren...");
                            Console.ReadKey(true);
                            break;
                        }
                    }
                }
                else if (ausgewaehlt == 3) // Beenden
                {
                    return;
                }
            }
        }
    }
}

Hinweise: