Сравнивается без учета регистра сравнение строк в 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 проблемы, которые я могу придумать с верхней части моей головы

  1. выделяет память. Функции сравнения не должны выделять память, если они абсолютно не должны.
  2. строки могут быть понижены несколькими способами. Наиболее заметный порядковый номер или культура чувствительны ниже. В какую сторону .ToLower () работа? Лично я не знаю. Гораздо лучше передать эксплицитную культуру чем полагаться на дефолт.

другая статья MSDN, которая предоставляет некоторые DOs и DON'TS и рекомендации для того, какой метод сравнения использовать в различных случаях:новые рекомендации по использованию строк в Microsoft .NET 2.0


ToLower () не является функцией сравнения, он помещает строку в нижний регистр. Когда оператор == используется для строковых объектов в C#, он оптимизируется компилятором. В основе, оба зависят от системы.Строка.Равно как видно в отражателе.


может ли ваш пост ваш тест, который показывает, что вызов ToLower () быстрее, чем сравнение без учета регистра? Мои тесты показывают обратное! Несмотря ни на что, другие постеры о корректности стоят.