Skip to content

C# Control Structures

This chapter will detail control structures in C#, including conditional statements, loop statements, and jump statements, which are the foundation of program flow control.

Conditional Statements

if Statement

Basic if Statement

csharp
// Basic syntax
if (condition)
{
    // Code executed when condition is true
}

// Example
int age = 18;
if (age >= 18)
{
    Console.WriteLine("You are an adult");
}

// Single-line statements can omit braces (not recommended)
if (age >= 18)
    Console.WriteLine("You are an adult");

if-else Statement

csharp
int score = 85;

if (score >= 90)
{
    Console.WriteLine("Excellent");
}
else if (score >= 80)
{
    Console.WriteLine("Good");
}
else if (score >= 70)
{
    Console.WriteLine("Average");
}
else if (score >= 60)
{
    Console.WriteLine("Pass");
}
else
{
    Console.WriteLine("Fail");
}

Nested if Statements

csharp
int age = 20;
bool hasLicense = true;

if (age >= 18)
{
    if (hasLicense)
    {
        Console.WriteLine("You can drive");
    }
    else
    {
        Console.WriteLine("You need a license to drive");
    }
}
else
{
    Console.WriteLine("You are too young to drive");
}

switch Statement

Basic switch

csharp
int dayOfWeek = 3;

switch (dayOfWeek)
{
    case 1:
        Console.WriteLine("Monday");
        break;
    case 2:
        Console.WriteLine("Tuesday");
        break;
    case 3:
        Console.WriteLine("Wednesday");
        break;
    case 4:
        Console.WriteLine("Thursday");
        break;
    case 5:
        Console.WriteLine("Friday");
        break;
    case 6:
        Console.WriteLine("Saturday");
        break;
    case 7:
        Console.WriteLine("Sunday");
        break;
    default:
        Console.WriteLine("Invalid day");
        break;
}

switch with Multiple Cases

csharp
int month = 2;

switch (month)
{
    case 12:
    case 1:
    case 2:
        Console.WriteLine("Winter");
        break;
    case 3:
    case 4:
    case 5:
        Console.WriteLine("Spring");
        break;
    case 6:
    case 7:
    case 8:
        Console.WriteLine("Summer");
        break;
    case 9:
    case 10:
    case 11:
        Console.WriteLine("Fall");
        break;
}

switch Expression (C# 8.0+)

csharp
string grade = "B";

string message = grade switch
{
    "A" => "Excellent",
    "B" => "Good",
    "C" => "Average",
    "D" => "Below Average",
    "F" => "Fail",
    _ => "Invalid Grade"
};

Console.WriteLine(message);

Loop Statements

while Loop

csharp
// Basic while loop
int count = 0;
while (count < 5)
{
    Console.WriteLine($"Count: {count}");
    count++;
}

// Infinite loop with break condition
while (true)
{
    Console.WriteLine("Enter 'quit' to exit");
    string input = Console.ReadLine();
    if (input == "quit")
        break;
}

do-while Loop

csharp
// do-while loop (executes at least once)
int number;
do
{
    Console.Write("Enter a positive number: ");
    number = int.Parse(Console.ReadLine());
} while (number <= 0);

Console.WriteLine($"You entered: {number}");

for Loop

csharp
// Basic for loop
for (int i = 0; i < 10; i++)
{
    Console.WriteLine($"Iteration: {i}");
}

// for loop with multiple variables
for (int i = 0, j = 10; i < j; i++, j--)
{
    Console.WriteLine($"i: {i}, j: {j}");
}

// Nested for loops
for (int row = 0; row < 3; row++)
{
    for (int col = 0; col < 3; col++)
    {
        Console.Write($"[{row},{col}] ");
    }
    Console.WriteLine();
}

foreach Loop

csharp
// foreach with array
int[] numbers = { 10, 20, 30, 40, 50 };
foreach (int number in numbers)
{
    Console.WriteLine($"Number: {number}");
}

// foreach with list
List<string> fruits = new List<string> { "Apple", "Banana", "Orange" };
foreach (string fruit in fruits)
{
    Console.WriteLine($"Fruit: {fruit}");
}

// foreach with string
string text = "Hello World";
foreach (char character in text)
{
    Console.WriteLine($"Character: {character}");
}

Jump Statements

break Statement

csharp
// break in loops
for (int i = 0; i < 10; i++)
{
    if (i == 5)
        break;  // Exit loop when i equals 5
    Console.WriteLine($"i: {i}");
}

// break in switch
int choice = 2;
switch (choice)
{
    case 1:
        Console.WriteLine("Option 1");
        break;
    case 2:
        Console.WriteLine("Option 2");
        break;  // Exit switch
    default:
        Console.WriteLine("Invalid option");
        break;
}

continue Statement

csharp
// continue in loops
for (int i = 0; i < 10; i++)
{
    if (i % 2 == 0)
        continue;  // Skip even numbers
    Console.WriteLine($"Odd number: {i}");
}

// continue with while
int num = 0;
while (num < 10)
{
    num++;
    if (num % 3 == 0)
        continue;  // Skip multiples of 3
    Console.WriteLine($"Not divisible by 3: {num}");
}

goto Statement (Use Sparingly)

csharp
// goto example (not recommended for general use)
int i = 0;
start:
Console.WriteLine($"i: {i}");
i++;

if (i < 5)
    goto start;

Console.WriteLine("Loop finished");

Pattern Matching (C# 7.0+)

Type Pattern

csharp
object obj = "Hello World";

switch (obj)
{
    case string s:
        Console.WriteLine($"String: {s}");
        break;
    case int i:
        Console.WriteLine($"Integer: {i}");
        break;
    case double d:
        Console.WriteLine($"Double: {d}");
        break;
    default:
        Console.WriteLine("Unknown type");
        break;
}

Constant Pattern

csharp
int value = 42;

switch (value)
{
    case 0:
        Console.WriteLine("Zero");
        break;
    case 1:
        Console.WriteLine("One");
        break;
    case 42:
        Console.WriteLine("The answer to everything");
        break;
    default:
        Console.WriteLine("Other number");
        break;
}

Relational Pattern

csharp
int score = 85;

switch (score)
{
    case < 60:
        Console.WriteLine("Fail");
        break;
    case >= 60 and < 70:
        Console.WriteLine("Pass");
        break;
    case >= 70 and < 80:
        Console.WriteLine("Good");
        break;
    case >= 80 and < 90:
        Console.WriteLine("Very Good");
        break;
    case >= 90:
        Console.WriteLine("Excellent");
        break;
}

Advanced Control Structures

Ternary Operator

csharp
// Basic ternary operator
int age = 18;
string message = age >= 18 ? "Adult" : "Minor";
Console.WriteLine(message);

// Nested ternary (not recommended for complex logic)
int score = 75;
string grade = score >= 90 ? "A" :
              score >= 80 ? "B" :
              score >= 70 ? "C" :
              score >= 60 ? "D" : "F";
Console.WriteLine($"Grade: {grade}");

Null-Coalescing Operator

csharp
string name = null;
string displayName = name ?? "Guest";
Console.WriteLine($"Hello, {displayName}");

// With nullable value types
int? age = null;
int userAge = age ?? 18;
Console.WriteLine($"Age: {userAge}");

Null-Conditional Operator

csharp
// Traditional null checking
string text = null;
int length = 0;
if (text != null)
{
    length = text.Length;
}

// Using null-conditional operator
int length2 = text?.Length ?? 0;
Console.WriteLine($"Length: {length2}");

// Chaining null-conditional
Person person = null;
string cityName = person?.Address?.City ?? "Unknown";
Console.WriteLine($"City: {cityName}");

Practical Examples

Number Guessing Game

csharp
Random random = new Random();
int targetNumber = random.Next(1, 100);
int guess = 0;
int attempts = 0;

Console.WriteLine("Guess the number between 1 and 100!");

while (guess != targetNumber)
{
    Console.Write("Enter your guess: ");
    string input = Console.ReadLine();
    
    if (int.TryParse(input, out guess))
    {
        attempts++;
        
        if (guess < targetNumber)
            Console.WriteLine("Too low!");
        else if (guess > targetNumber)
            Console.WriteLine("Too high!");
        else
            Console.WriteLine($"Congratulations! You guessed it in {attempts} attempts!");
    }
    else
    {
        Console.WriteLine("Please enter a valid number.");
    }
}
csharp
while (true)
{
    Console.WriteLine("=== Main Menu ===");
    Console.WriteLine("1. Add User");
    Console.WriteLine("2. View Users");
    Console.WriteLine("3. Exit");
    Console.Write("Enter your choice: ");
    
    string choice = Console.ReadLine();
    
    switch (choice)
    {
        case "1":
            Console.WriteLine("Adding user...");
            break;
        case "2":
            Console.WriteLine("Viewing users...");
            break;
        case "3":
            Console.WriteLine("Exiting...");
            return; // Exit program
        default:
            Console.WriteLine("Invalid choice. Please try again.");
            break;
    }
    
    Console.WriteLine(); // Empty line for spacing
}

Data Validation Loop

csharp
int age;
do
{
    Console.Write("Enter your age (1-120): ");
    string input = Console.ReadLine();
    
    if (int.TryParse(input, out age) && age >= 1 && age <= 120)
    {
        break; // Valid input, exit loop
    }
    
    Console.WriteLine("Invalid age. Please enter a number between 1 and 120.");
} while (true);

Console.WriteLine($"Your age is: {age}");

Best Practices

Use Appropriate Control Structures

csharp
// Good: Use switch for multiple discrete values
string dayType = dayOfWeek switch
{
    1 or 2 or 3 or 4 or 5 => "Weekday",
    6 or 7 => "Weekend",
    _ => "Invalid"
};

// Avoid: Long if-else chains for the same purpose

Keep Conditions Simple

csharp
// Good: Break complex conditions into variables
bool isAdult = age >= 18;
bool hasLicense = licenseNumber != null;
bool canDrive = isAdult && hasLicense;

if (canDrive)
{
    Console.WriteLine("You can drive");
}

// Avoid: Complex inline conditions

Use Meaningful Variable Names

csharp
// Good: Descriptive names
int numberOfStudents = 30;
bool isEligibleForDiscount = age >= 65;

// Avoid: Cryptic names
int n = 30;
bool f = age >= 65;

Summary

In this chapter, you learned:

  • Conditional statements: if, if-else, switch
  • Loop statements: while, do-while, for, foreach
  • Jump statements: break, continue, goto
  • Pattern matching features
  • Advanced operators: ternary, null-coalescing, null-conditional
  • Practical examples and best practices

Control structures are essential for creating dynamic and responsive programs. In the next chapter, we'll explore methods and functions to organize and reuse code effectively.

Content is for learning and research only.