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.