Зачем избегать string.ToLower() при выполнении строковых сравнений без учета регистра?

Я прочитал, что когда в вашем приложении вы выполняете много сравнения строк и используете метод ToLower, этот метод довольно дорогостоящий. Мне было интересно, кто-нибудь может объяснить мне, как это дорого. Поблагодарили бы за любую информацию или объяснение. Спасибо!

Ответы

Ответ 1

Это дорого, потому что новая строка "изготовлена".

Сравните это с вызовом, скажем, с равными с перегрузкой, которая запрашивает сравнение без учета регистра. Это позволяет завершить сравнение, не создавая новую строку, как только будет обнаружено несоответствие.

Ответ 2

См. также безопасный для записи код управления, по какой-то причине, почему бы не использовать ToLower().

В частности, см. раздел о турецком "Я" - это не вызвало никаких проблем в прошлом, когда я работаю...

Вызов "I".ToLower() не вернется "i", если текущая культура - турецкая или азербайджанская. Прямое сравнение с этим вызовет проблемы.

Ответ 3

Существует еще одно преимущество использования метода String.Compare(String, String, StringComparison), помимо тех, что указаны в других ответах:

Вы можете передать значения null и получить относительное значение сравнения. Это значительно упрощает запись сравнений строк.

String.Compare(null, "some StrinG", StringComparison.InvariantCultureIgnoreCase);

Из документации:

Один или оба сравнения могут быть null. По определению любая строка, включая пустую строку (""), сравнивается больше, чем нулевая ссылка; и две нулевые ссылки сравниваются друг с другом.

Ответ 4

Каждый раз, когда вы вызываете ToLower(), будет создана новая копия строки (в отличие от изменения случая на месте). Это может быть дорогостоящим, если у вас много строк или длинных строк.

От String.ToLower docs:

Возвращает копию этой строки, преобразованную в нижний регистр.