Глиф Учебники

Как сравнить строки — ==, Equals и без учёта регистра

Справочник · C# · 2 минуты чтения

C#
string a = "Привет";
string b = "привет";

Console.WriteLine(a == b);
Console.WriteLine(a.Equals(b));
Console.WriteLine(a.Equals(b, StringComparison.OrdinalIgnoreCase));
Console.WriteLine(string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase));
Вывод
False
False
True
True

В C# == для строк сравнивает текст, а не адреса в памяти, как в Java. Писать a.Equals(b) вместо a == b ради «правильности» не нужно.

Ответ пользователя: «да», «Да», «ДА»

Ввод с клавиатуры удобно сравнивать без учёта регистра и без лишних пробелов по краям:

C#
Console.Write("Продолжить? ");
string answer = (Console.ReadLine() ?? "").Trim();
if (answer.Equals("да", StringComparison.OrdinalIgnoreCase))
{
    Console.WriteLine("Продолжаем");
}
else
{
    Console.WriteLine("Стоп");
}

Часто пишут и answer.ToLower() == "да" — это работает, но создаёт лишнюю строку. Вариант с StringComparison точнее и быстрее.

Какая строка раньше по алфавиту

string.Compare(a, b) и a.CompareTo(b) возвращают число: меньше нуля — a раньше, ноль — равны, больше нуля — a позже. Само значение может быть любым, поэтому сравнивайте его с нулём, а не с −1 или 1:

C#
Console.WriteLine(string.Compare("арбуз", "банан") < 0);
Console.WriteLine("кот".CompareTo("кот") == 0);
Console.WriteLine(string.Compare("Яблоко", "яблоко", StringComparison.OrdinalIgnoreCase) == 0);
Вывод
True
True
True

Сортировка массива строк по алфавиту — Array.Sort(words), списка — list.Sort(); без учёта регистра — Array.Sort(words, StringComparer.OrdinalIgnoreCase).

Ordinal или культура

Культура в .NET — правила языка и страны: порядок букв, большие и маленькие буквы, запись чисел и дат. Ordinal — сравнение просто по кодам символов, без этих правил.

СпособКак сравниваетКогда брать
Ordinal, OrdinalIgnoreCaseпо кодам символовкоманды, имена файлов, ключи настроек, ответы «да/нет»
CurrentCulture, CurrentCultureIgnoreCaseпо правилам языка из настроек компьютерасортировка слов для показа человеку
InvariantCultureпо правилам, не зависящим от настроекодинаковый порядок на любом компьютере

Разница видна на буквах вроде ё: по кодам она идёт после я, а по правилам языка — рядом с е.

Подводные камни