Сравнивается без учета регистра сравнение строк в C#
предположим, у меня есть две строки: a и b. Чтобы сравнить, имеют ли a и be одинаковые значения, когда case игнорируется, я всегда использовал:
// (Assume a and b have been verified not to be null)
if (a.ToLower() == b.ToLower())
однако, используя Reflector, я видел это несколько раз в .NET Framework:
// (arg three is ignoreCase)
if (string.Compare(a, b, true) == 0)
Я проверил, что быстрее, и ToLower()
избил Compare()
каждый раз, когда я использовал строки.
есть ли причина, почему Compare()
вместо ToLower()
? Что-то о другом CultureInfo
? Я чешу голова.
6 ответов
раздел замечаний статья MSDN должен объяснить вещи. По сути, причина заключается в совместимости параметров разных культур.
главное, о чем вы должны беспокоиться, это не производительность, это правильность, и с этой точки зрения метод вы наверное хотите использовать для сравнения без учета регистра либо:
string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0;
или
a.Equals(b, StringComparison.OrdinalIgnoreCase)
(первый полезен, если вы знаете, что строки могут быть null; последний проще написать, если вы уже знаете, что по крайней мере одна строка не является null. Я никогда не тестировал производительность, но предполагаю, что это будет подобный.)
Ordinal
или OrdinalIgnoreCase
являются безопасной ставкой, если вы не знаете, что хотите использовать другой метод сравнения; чтобы получить информацию, необходимую для принятия решения прочитайте эту статью на MSDN.
при сравнении строк вы должны всегда используйте явный элемент StringComparison. Строковые функции несколько непоследовательны в том, как они выбирают сравнение строк. Единственный способ гарантировать используемое сравнение-а) запомнить все из них (это включает как вас, так и всех в вашей команде) или б) использовать явное сравнение для каждой функции.
гораздо лучше быть явным и не полагаться на то, что групповые знания совершенны. Ваши товарищи по команде будут спасибо тебе за это.
пример:
if ( StringComparison.OrdinalIgnoreCase.Equals(a,b) )
использование ToLower для сравнения имеет 2 проблемы, которые я могу придумать с верхней части моей головы
- выделяет память. Функции сравнения не должны выделять память, если они абсолютно не должны.
- строки могут быть понижены несколькими способами. Наиболее заметный порядковый номер или культура чувствительны ниже. В какую сторону .ToLower () работа? Лично я не знаю. Гораздо лучше передать эксплицитную культуру чем полагаться на дефолт.
другая статья MSDN, которая предоставляет некоторые DOs и DON'TS и рекомендации для того, какой метод сравнения использовать в различных случаях:новые рекомендации по использованию строк в Microsoft .NET 2.0
ToLower () не является функцией сравнения, он помещает строку в нижний регистр. Когда оператор == используется для строковых объектов в C#, он оптимизируется компилятором. В основе, оба зависят от системы.Строка.Равно как видно в отражателе.
может ли ваш пост ваш тест, который показывает, что вызов ToLower () быстрее, чем сравнение без учета регистра? Мои тесты показывают обратное! Несмотря ни на что, другие постеры о корректности стоят.