Сравнивается без учета регистра сравнение строк в 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)(первый вариант полезен, если вы знаете, что строки могут быть нулевыми; последний проще написать, если вы уже знаете, что по крайней мере одна строка не является нулевой. Я никогда не проверял производительность, но предполагаю, что она будет аналогичной.)
OrdinalилиOrdinalIgnoreCaseявляются безопасным Ставьте, если вы не знаете, что хотите использовать другой метод сравнения; чтобы получить информацию, необходимую для принятия решения , прочитайте эту статью на MSDN.
При сравнении строк вы должны всегда использовать явный член StringComparison. Строковые функции несколько непоследовательны в том, как они выбирают для сравнения строки. Единственный способ гарантировать использование сравнения - это а) запомнить все из них (это касается как вас, так и всех членов вашей команды) или б) использовать явное сравнение для каждой функции.
Гораздо лучше быть эксплицитным и не полагаться на то, что групповые знания совершенны. Ваши товарищи по команде будут благодарны Вам за этот.Пример:
if ( StringComparison.OrdinalIgnoreCase.Equals(a,b) )Использование ToLower для сравнения имеет 2 проблемы, которые я могу придумать с верхней части моей головы
- он выделяет память. Функции сравнения не должны выделять память без крайней необходимости.
Строки могут быть опущены несколькими способами. Наиболее заметны порядковые или чувствительные к культуре нижние. В какую сторону идет .ToLower () работа? Лично я этого не знаю. Гораздо лучше передать явную культуру, чем полагаться на дефолт.
Еще одна статья MSDN, которая содержит некоторые DOs и DON'T и рекомендации по использованию метода сравнения в различных случаях: Новые рекомендации по использованию строк в Microsoft .NET 2.0
ToLower() не является функцией сравнения, она помещает строку в нижний регистр. Когда оператор == используется для строковых объектов в C#, он оптимизируется компилятором. По сути, и то и другое зависит от системы.Строка.Равны, как видно в отражателе.
Не могли бы вы опубликовать свой тест, который показывает, что вызов ToLower () быстрее, чем сравнение без учета регистра? Мои тесты показывают обратное! Тем не менее, другие постеры указывают на правильность.
Comments