Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Sử dụng string trong câu lệnh switch trong C#

Giới thiệu

C# cho phép dùng **string** làm biểu thức trong câu lệnh switch (từ C# 1.0). So sánh mặc định là **ordinal case-sensitive** (phân biệt chữ hoa/thường).

Ví dụ cơ bản

using System;

public class Demo
{
    public static void Main(string[] args)
    {
        string grade = "A1";

        switch (grade)
        {
            case "A1":
                Console.WriteLine("Very good!");
                break;
            case "A2":
                Console.WriteLine("Good!");
                break;
            case "B1":
                Console.WriteLine("Satisfactory!");
                break;
            default:
                Console.WriteLine("Invalid!");
                break;
        }

        Console.WriteLine($"Grade = {grade}");
    }
}

Kết quả

Very good!
Grade = A1

Switch Expression (C# 8.0+) - Ngắn gọn hơn

using System;

public class Demo
{
    public static void Main()
    {
        string grade = "B1";

        string result = grade switch
        {
            "A1" => "Very good!",
            "A2" => "Good!",
            "B1" => "Satisfactory!",
            _ => "Invalid!"
        };

        Console.WriteLine(result); // Satisfactory!
    }
}

Pattern Matching (C# 7.0+)

string input = "  Hello  ";

string result = input switch
{
    null => "Null",
    "" => "Empty",
    string s when s.Trim().Length == 0 => "Whitespace",
    var s => s.Trim().ToUpper()
};

Console.WriteLine(result); // HELLO

So sánh case-insensitive

C# không hỗ trợ switch case-insensitive trực tiếp. Các cách xử lý:

// Cách 1: ToLower/ToUpper trước khi switch
switch (grade.ToUpperInvariant())
{
    case "A1": ...
}

// Cách 2: Dùng if-else với StringComparison
if (string.Equals(grade, "A1", StringComparison.OrdinalIgnoreCase)) { ... }

// Cách 3: Switch expression với pattern matching (C# 9+)
var result = grade switch
{
    string s when s.Equals("A1", StringComparison.OrdinalIgnoreCase) => "Very good!",
    _ => "Invalid"
};

Lưu ý hiệu năng

  • Switch string dùng hash table nội bộ (O(1) trung bình) -> nhanh hơn chuỗi if-else dài.
  • Tránh tạo string mới trong case label (hằng số).
  • Với nhiều case, cân nhắc Dictionary<string, Action> hoặc pattern matching.