У меня есть такой код:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
Меня не волнует дело. Должен ли я использовать OrdinalIgnoreCase
, InvariantCultureIgnoreCase
или CurrentCultureIgnoreCase
?
У меня есть такой код:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
Меня не волнует дело. Должен ли я использовать OrdinalIgnoreCase
, InvariantCultureIgnoreCase
или CurrentCultureIgnoreCase
?
Ответы:
Из MSDN " Новые рекомендации по использованию строк в Microsoft .NET 2.0 "
Описание: Владельцам кода, ранее использующим
InvariantCulture
для сравнения строк, регистр и сортировку, настоятельно рекомендуется использовать новый наборString
перегрузок в Microsoft .NET 2.0. В частности, данные, предназначенные для того, чтобы быть независимыми от культуры и не относящимися к языку, должны начинать указывать перегрузки, используя либо новое членство,StringComparison.Ordinal
либоStringComparison.OrdinalIgnoreCase
членыStringComparison
. Они обеспечивают побайтовое сравнение, подобное тому,strcmp
которое не только позволяет избежать ошибок в лингвистической интерпретации по существу символических строк, но и обеспечивает лучшую производительность.
"Straße"
и "STRASSE"
. При использовании OrdinalIgnoreCase
на Equals
отдачу false
, а InvariantCultureIgnoreCase
говорит , что они равны.
Сравнивать строки в юникоде сложно:
Реализация поиска и сравнения строк Unicode в программном обеспечении для обработки текста должна учитывать наличие эквивалентных кодовых точек. В отсутствие этой функции пользователи, ищущие определенную последовательность кодовых точек, не смогут найти другие визуально неразличимые глифы, которые имеют другое, но канонически эквивалентное представление кодовых точек.
см .: http://en.wikipedia.org/wiki/Unicode_equivalence
Если вы пытаетесь сравнить 2 строки юникода без учета регистра и хотите, чтобы они работали ВЕЗДЕ , у вас возникла невозможная проблема.
Классическим примером является турецкий i , который в верхнем регистре становится İ (обратите внимание на точку)
По умолчанию .NET Framework обычно использует CurrentCulture для функций, связанных со строками, за очень важным исключением - .Equals
используется порядковое (побайтное) сравнение.
Это приводит к тому, что различные строковые функции ведут себя по-разному в зависимости от культуры компьютера.
Тем не менее, иногда мы хотим «общего назначения», без учета регистра, сравнения.
Например, вы можете захотеть, чтобы сравнение строк велось одинаково, независимо от того, на каком компьютере установлено приложение.
Для этого у нас есть 3 варианта:
Правила эквивалентности Unicode сложны, что означает, что использование метода 1) или 2) более затратно, чем OrdinalIgnoreCase
. Тот факт, что OrdinalIgnoreCase
не выполняется какая-либо специальная нормализация Юникода, означает, что некоторые строки, которые отображаются одинаково на экране компьютера, не будут считаться идентичными. Например: "\u0061\u030a"
и "\u00e5"
оба рендера. Однако в порядковом сравнении будет считаться другим.
То, что вы выберете, во многом зависит от приложения, которое вы создаете.
У Microsoft есть свои рекомендации с четкими рекомендациями. Тем не менее, очень важно понять понятие эквивалентности Юникода, прежде чем подходить к этим проблемам.
Кроме того, имейте в виду, что OrdinalIgnoreCase - это особый вид зверя, который выбирает и выбирает немного порядкового сравнения с некоторыми смешанными в лексикографических аспектах. Это может сбивать с толку.
Это зависит от того, что вы хотите, хотя я бы уклоняться от InvariantCulture , если вы не очень уверены , что вы никогда не хотите , чтобы локализовать код для других языков. Вместо этого используйте CurrentCulture.
Кроме того, OrdinalIgnoreCase должен учитывать числа, которые могут или не могут быть тем, что вы хотите.
Очень простой ответ: если вы не используете турецкий язык, вам не нужно использовать InvariantCulture.
Смотрите следующую ссылку: