Ответ
Сравнение строк в C# — критически важная операция, и выбор правильного метода зависит от семантики сравнения (с учетом/без учета регистра, культуры).
Основные методы и их различия:
| Метод | Описание | Рекомендуется для |
|---|---|---|
== / != операторы |
Сравнивают содержимое строк (не ссылки). Используют String.Equals под капотом. |
Общего сравнения, когда ясна семантика. |
string.Equals(a, b) |
Прямой вызов метода сравнения. Позволяет явно указать тип сравнения. | Явного указания правил сравнения. |
string.Compare(a, b) |
Возвращает целое число (0 — равны, <0 — a меньше b, >0 — a больше b). Полезно для сортировки. |
Упорядочивания и сортировки. |
Ключевой параметр: StringComparison
Всегда указывайте StringComparison для избежания двусмысленности и потенциальных проблем с производительностью и локалью.
string str1 = "Hello";
string str2 = "hello";
// НЕПРАВИЛЬНО: Зависит от текущих настроек культуры (может быть медленнее).
bool badExample = str1.Equals(str2, StringComparison.CurrentCultureIgnoreCase);
// ПРАВИЛЬНО: Использовать явные, детерминированные правила.
// 1. Порядковое сравнение (быстрое, по кодам Unicode) — для внутренних идентификаторов.
bool isEqualOrdinal = str1.Equals(str2, StringComparison.Ordinal); // false
bool isEqualOrdinalIgnoreCase = str1.Equals(str2, StringComparison.OrdinalIgnoreCase); // true
// 2. Сравнение с учетом культуры — для отображения пользователю.
bool isEqualCulture = str1.Equals(str2, StringComparison.CurrentCulture); // false (зависит от правил языка)
// 3. Сравнение для сортировки.
int result = String.Compare(str1, str2, StringComparison.OrdinalIgnoreCase); // result == 0
Правило: Для сравнения строк, не зависящего от локали (логины, имена файлов, теги), всегда используйте StringComparison.Ordinal или StringComparison.OrdinalIgnoreCase.
Ответ 18+ 🔞
Блядь, ну вот смотри, сравнивать строки в C# — это ж как гонки на картонных тачках: вроде просто, но если накосячить, то разлетишься в хлам. А всё потому, что разработчики часто хуярят сравнения как попало, а потом удивляются, почему логины не работают или сортировка ебёт мозг.
Смотри, есть три основных подхода, и каждый для своего случая:
1. Операторы == и !=
Это как молоток — инструмент простой и всем знакомый. Под капотом они вызывают String.Equals, но семантика сравнения может плавать, если не знать контекста. Используй, когда точно уверен, что нужно.
2. Прямой вызов string.Equals(a, b)
Тут уже можно тонко настраивать. Хочешь игнорировать регистр? Без проблем. Главное — не забудь указать, как именно сравнивать, а то получишь сюрприз.
3. string.Compare(a, b)
Это уже для тех, кому мало просто "равно/не равно". Метод возвращает число, которое говорит не только о равенстве, но и о порядке. Идеально для сортировки, когда нужно знать, какая строка "больше" или "меньше".
А теперь самое важное, ёпта: параметр StringComparison. Это твой спасательный круг в море неопределённости. Если его не указать, то C# начнёт гадать на кофейной гуще, учитывая текущую культуру, и это может быть медленно и непредсказуемо.
string str1 = "Hello";
string str2 = "hello";
// Вот так делать НЕ НАДО. Это как стрелять из пушки по воробьям: результат зависит от настроек системы, и тормозит.
bool badExample = str1.Equals(str2, StringComparison.CurrentCultureIgnoreCase);
// А вот так — правильно. Берёшь конкретный метод и не паришься.
// 1. Порядковое сравнение (Ordinal) — быстрое и жёсткое, по кодам символов.
// Подходит для всего внутреннего: логины, пароли, имена файлов, теги.
bool isEqualOrdinal = str1.Equals(str2, StringComparison.Ordinal); // false
bool isEqualOrdinalIgnoreCase = str1.Equals(str2, StringComparison.OrdinalIgnoreCase); // true
// 2. Сравнение с учётом культуры (Culture-sensitive) — когда строки показывают пользователю.
// Медленнее, но соблюдает правила языка (например, умляуты в немецком).
bool isEqualCulture = str1.Equals(str2, StringComparison.CurrentCulture); // false, зависит от правил
// 3. Compare для сортировки.
int result = String.Compare(str1, str2, StringComparison.OrdinalIgnoreCase); // result == 0
Итоговое правило, которое нужно выжечь на подкорке:
Если ты сравниваешь что-то техническое (логин, путь к файлу, XML-тег, константу), всегда используй StringComparison.Ordinal или OrdinalIgnoreCase. Это быстро, надёжно и не зависит от того, сидит пользователь в США или в Зажопинске. А культуру оставь для того, что видит юзер — для интерфейсов, сообщений и отчётов. Всё, вопрос закрыт.