Зачем избегать 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:
Возвращает копию этой строки, преобразованную в нижний регистр.