Как правильно сравнивать строки (String) в C#?

«Как правильно сравнивать строки (String) в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сравнение строк в 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.