Kiểm tra sự tồn tại của một chuỗi trong mảng/collection string.
Cách 1: LINQ Contains (Khuyến nghị)
string[] names = { "Sachin", "India", "Bangalore", "Karnataka", "Delhi" };
bool hasSachin = names.Contains("Sachin"); // true (case-sensitive)
bool hasSachinLower = names.Contains("sachin"); // false
// Case-insensitive
bool hasSachinCI = names.Contains("sachin", StringComparer.OrdinalIgnoreCase); // true
Cách 2: LINQ Any với Predicate
// Case-sensitive
bool any1 = names.Any(x => x == "Sachin"); // true
// Case-insensitive
bool any2 = names.Any(x => x.Equals("sachin", StringComparison.OrdinalIgnoreCase)); // true
// Partial match (chứa chuỗi con)
bool any3 = names.Any(x => x.Contains("gal", StringComparison.OrdinalIgnoreCase)); // true (Bangalore)
Cách 3: Array.IndexOf / Array.FindIndex
int index = Array.IndexOf(names, "Sachin"); // 0 nếu tìm thấy, -1 nếu không
bool found = index >= 0;
// Case-insensitive
int indexCI = Array.FindIndex(names, x => x.Equals("sachin", StringComparison.OrdinalIgnoreCase));
Cách 4: HashSet (Hiệu suất O(1) cho lookup nhiều lần)
// Tạo HashSet một lần
var nameSet = new HashSet(names, StringComparer.OrdinalIgnoreCase);
// Lookup nhanh
bool found = nameSet.Contains("sachin"); // true, O(1)
bool found2 = nameSet.Contains("mumbai"); // false
Cách 5: Foreach thủ công (Không khuyến nghị)
bool found = false;
foreach (string name in names)
{
if (name == "Sachin") { found = true; break; }
}
So sánh hiệu suất
| Phương pháp | Phức tạp | Case-insensitive | Ghi chú |
|---|---|---|---|
Contains | O(n) | Có (overload) | Đơn giản, single check |
Any | O(n) | Có (lambda) | Linh hoạt predicate |
HashSet.Contains | O(1) | Có (ctor) | Best cho multiple lookups |
foreach | O(n) | Manual | Tránh, verbose |
Trả về phần tử tìm thấy (FirstOrDefault)
string found = names.FirstOrDefault(x => x.Equals("sachin", StringComparison.OrdinalIgnoreCase));
if (found != null) Console.WriteLine($"Found: {found}");
Best Practice
- Single check:
ContainshoặcAny. - Multiple checks: Tạo
HashSetmột lần. - Case-insensitive: Luôn chỉ định
StringComparer.OrdinalIgnoreCase. - Null safety: Kiểm tra null trước khi gọi method.