C# Loops (for, foreach, while, do-while)
Learn how to use for, foreach, while, and do-while loops in C#. Discover practical examples for handling repeated operations in C# applications.
In C#, loops allow us to execute the same block of code repeatedly as long as a certain condition is true. They save time for the programmer and make it easy to perform repetitive tasks. The most commonly used loops in C# are: for, foreach, while, and do-while.
for Loop
The for loop is generally used when the number of repetitions is known. It is controlled with a counter variable.
Counting Up: The i counter increases by 1 each time. The loop ends before it reaches 5.
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Step: " + i);
}
// Output:
Step: 0
Step: 1
Step: 2
Step: 3
Step: 4
Counting Down: The i counter decreases by 1 each time. The loop ends before it reaches 0.
for (int i = 5; i > 0; i--)
{
Console.WriteLine("Countdown: " + i);
}
// Output:
Countdown: 5
Countdown: 4
Countdown: 3
Countdown: 2
Countdown: 1
Increment by 5: The i counter increases by 5 each time. The loop ends when it reaches 25.
for (int i = 0; i <= 25; i += 5)
{
Console.WriteLine("Number: " + i);
}
// Output:
Number: 0
Number: 5
Number: 10
Number: 15
Number: 20
Number: 25
Nested for Loop: With nested i and j counters, each counting up to 3, the program prints their products.
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 3; j++)
{
Console.Write($"{i * j}\t");
}
Console.WriteLine();
}
// Output:
1 2 3
2 4 6
3 6 9
break and continue
Sometimes in loops, the break and continue keywords are used to control the flow.
break: Completely terminates the loop.
for (int i = 1; i <= 5; i++)
{
if (i == 3)
break; // when i equals 3, the loop ends
Console.WriteLine("i: " + i);
}
// Output:
i: 1
i: 2
continue: Skips only the current iteration and continues with the rest of the loop.
for (int i = 1; i <= 5; i++)
{
if (i == 3)
continue; // when i equals 3, this step is skipped
Console.WriteLine("i: " + i);
}
// Output:
i: 1
i: 2
i: 4
i: 5
foreach Loop
The foreach loop is used to iterate over collections (array, list, etc.). You don’t need to know the number of elements.
string[] fruits = { "Apple", "Pear", "Banana" };
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
In this example, each element of the fruits array is printed to the console in order.
while Loop
The while loop repeats as long as the condition is true. The number of iterations may not be known beforehand.
Simple Counter: The number variable starts at 1 and is printed up to 3.
int number = 1;
while (number <= 3)
{
Console.WriteLine("Number: " + number);
number++;
}
// Output:
Number: 1
Number: 2
Number: 3
Printing Characters of a String: In this example, a while loop prints each character of a text.
If a space character is found, it is skipped with continue. If a period (.) is found, the loop ends with break.
string text = "The weather is nice. Let's go outside.";
int index = 0;
while (index < text.Length)
{
char c = text[index];
if (c == ' ')
{
index++;
continue; // skip spaces
}
if (c == '.')
break; // end loop when a period is found
Console.WriteLine(c);
index++;
}
// Output:
T
h
e
w
e
a
t
h
e
r
i
s
n
i
c
e
Infinite while(true) Example: In infinite loops, you can exit with break.
In this example, the user is repeatedly asked for a password until the correct one is entered.
while (true)
{
Console.Write("Enter password: ");
string password = Console.ReadLine();
if (password == "1234")
{
Console.WriteLine("Login successful!");
break; // correct password entered, exit loop
}
Console.WriteLine("Incorrect password, try again.");
}
// Example Run:
Enter password: 1111
Incorrect password, try again.
Enter password: 2222
Incorrect password, try again.
Enter password: 1234
Login successful!
do-while Loop
The do-while loop runs at least once and then checks the condition. This means it executes once even if the condition is false.
Simple Example: Even if the condition is not satisfied initially, the loop runs once.
int x = 5;
do
{
Console.WriteLine("x value: " + x);
x++;
} while (x < 5);
// Output:
x value: 5
Finding Divisors: Using a do-while loop to find the divisors of a user-entered number.
Console.Write("Enter a number: ");
int number = int.Parse(Console.ReadLine());
if (number <= 0)
{
Console.WriteLine("Enter a number greater than 0.");
}
else
{
int divisor = number;
Console.WriteLine($"Divisors of {number}:");
do
{
if (number % divisor == 0)
{
Console.WriteLine(divisor);
}
divisor--;
} while (divisor >= 1);
}
// Example Run:
Enter a number: 12
Divisors of 12:
12
6
4
3
2
1
Summary
- for → Suitable for counter-controlled iterations.
- foreach → Used to iterate over arrays or collections.
- while → Repeats as long as the condition is true.
- do-while → Runs at least once, then checks the condition.
- break → Terminates the loop.
- continue → Skips the current iteration of the loop.
Application: Menu and Product Management with Arrow Keys
In this example, we write a simple menu that works with an infinite loop and allows selection using the arrow keys (↑/↓) and Enter.
Arrays are used to store the name and price information of 5 products.
The menus are: Print Products, Update Product, Delete Product, Exit.
using System;
using System.Globalization;
class Program
{
static void Main()
{
string[] productNames = { "Pen", "Notebook", "Eraser", "Bag", "Ruler" };
decimal[] productPrices = { 12.5m, 45m, 7.9m, 350m, 22.75m };
string[] menu = { "Print Products", "Update Product", "Delete Product", "Exit" };
int selected = 0;
while (true) // Infinite loop
{
Console.Clear();
Console.WriteLine("=== Product Management ===\n");
// Menu drawing
for (int i = 0; i < menu.Length; i++)
{
if (i == selected)
{
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.Cyan;
Console.WriteLine($"> {menu[i]}");
Console.ResetColor();
}
else
{
Console.WriteLine($" {menu[i]}");
}
}
Console.WriteLine("\nUse arrow keys to navigate, Enter to select, Esc to quit.");
var key = Console.ReadKey(true);
if (key.Key == ConsoleKey.UpArrow)
selected = (selected - 1 + menu.Length) % menu.Length;
else if (key.Key == ConsoleKey.DownArrow)
selected = (selected + 1) % menu.Length;
else if (key.Key == ConsoleKey.Escape)
break;
else if (key.Key == ConsoleKey.Enter)
{
if (selected == 0) // Print Products
{
Console.Clear();
Console.WriteLine("=== Product List ===\n");
for (int i = 0; i < productNames.Length; i++)
{
string name = string.IsNullOrWhiteSpace(productNames[i]) ? "(deleted)" : productNames[i];
Console.WriteLine($"{i + 1}. {name,-15} | {productPrices[i],8:0.00} USD");
}
Console.WriteLine("\nPress any key to continue...");
Console.ReadKey(true);
}
else if (selected == 1) // Update Product
{
int index = 0;
while (true)
{
Console.Clear();
Console.WriteLine("=== Select a Product to Update ===\n");
for (int i = 0; i < productNames.Length; i++)
{
string name = string.IsNullOrWhiteSpace(productNames[i]) ? "(deleted)" : productNames[i];
if (i == index)
{
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.Yellow;
Console.WriteLine($"> {i + 1}. {name,-15} | {productPrices[i],8:0.00} USD");
Console.ResetColor();
}
else
{
Console.WriteLine($" {i + 1}. {name,-15} | {productPrices[i],8:0.00} USD");
}
}
Console.WriteLine("\nUse arrow keys to navigate, Enter to select, Esc to go back.");
var k = Console.ReadKey(true);
if (k.Key == ConsoleKey.UpArrow) index = (index - 1 + productNames.Length) % productNames.Length;
else if (k.Key == ConsoleKey.DownArrow) index = (index + 1) % productNames.Length;
else if (k.Key == ConsoleKey.Escape) break;
else if (k.Key == ConsoleKey.Enter)
{
Console.Clear();
Console.WriteLine("=== Update Product ===\n");
Console.WriteLine($"Selected: {productNames[index]} | Old price: {productPrices[index]:0.00} USD\n");
Console.Write("New name (leave blank to keep): ");
string newName = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(newName))
productNames[index] = newName.Trim();
Console.Write("New price (leave blank to keep): ");
string priceStr = Console.ReadLine();
if (decimal.TryParse(priceStr, NumberStyles.Any, CultureInfo.InvariantCulture, out decimal newPrice))
productPrices[index] = Math.Max(0, newPrice);
Console.WriteLine("\nUpdate completed. Press any key to continue...");
Console.ReadKey(true);
break;
}
}
}
else if (selected == 2) // Delete Product
{
int index = 0;
while (true)
{
Console.Clear();
Console.WriteLine("=== Select a Product to Delete ===\n");
for (int i = 0; i < productNames.Length; i++)
{
string name = string.IsNullOrWhiteSpace(productNames[i]) ? "(deleted)" : productNames[i];
if (i == index)
{
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.Red;
Console.WriteLine($"> {i + 1}. {name,-15} | {productPrices[i],8:0.00} USD");
Console.ResetColor();
}
else
{
Console.WriteLine($" {i + 1}. {name,-15} | {productPrices[i],8:0.00} USD");
}
}
Console.WriteLine("\nUse arrow keys to navigate, Enter to select, Esc to go back.");
var k = Console.ReadKey(true);
if (k.Key == ConsoleKey.UpArrow) index = (index - 1 + productNames.Length) % productNames.Length;
else if (k.Key == ConsoleKey.DownArrow) index = (index + 1) % productNames.Length;
else if (k.Key == ConsoleKey.Escape) break;
else if (k.Key == ConsoleKey.Enter)
{
productNames[index] = string.Empty;
productPrices[index] = 0m;
Console.WriteLine("\nProduct deleted. Press any key to continue...");
Console.ReadKey(true);
break;
}
}
}
else if (selected == 3) // Exit
{
return;
}
}
}
}
}
Notes:
- Navigation with arrow keys is handled using
Console.ReadKey(true)andConsoleKey. - Menus are redrawn inside an infinite loop; exit with
EscorExit. - Deleted products are shown with the
(deleted)label and a price of0 USD. decimal.TryParseis used for numeric conversion of price input.