Выбор ответа Middle Строки обновлено

Как правильно сравнивать строки без учёта регистра

Вопрос

Нужно сравнить идентификаторы (ключи API, имена заголовков) без учёта регистра. Какой способ правильный?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: string.Equals(a, b, StringComparison.OrdinalIgnoreCase). Для технических идентификаторов нужно порядковое сравнение OrdinalIgnoreCase: оно не зависит от культуры и не создаёт новых строк.

Варианты ответа

  1. a.ToLower() == b.ToLower()
  2. string.Compare(a, b, true) == 0 с текущей культурой
  3. string.Equals(a, b, StringComparison.OrdinalIgnoreCase)правильный ответ
  4. a.ToUpperInvariant().GetHashCode() == b.ToUpperInvariant().GetHashCode()

Разбор

Для технических идентификаторов нужно порядковое сравнение OrdinalIgnoreCase: оно не зависит от культуры и не создаёт новых строк. ToLower() выделяет две строки и использует текущую культуру: в турецкой культуре "I".ToLower() даёт ı без точки, и сравнение ломается. string.Compare(a, b, true) тоже культурозависим. Совпадение хешей не гарантирует равенство строк.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.