При сравнении двух строк в c # на равенство, в чем разница между InvariantCulture и Порядковым сравнением?
c#
.net
string-comparison
ordinal
Капил
источник
источник
String1.Equals(String2, StringComparison.Ordinal)
, кто использует , вам лучше использовать,String1 == String2
что по сути,String1.Equals(String2)
и это по умолчанию порядковое сравнение с учетом регистра.==
«лучше», но это а) короче, б) менее ясно о том, что именно он делает, и в)String1
может быть нулевым без сравнения, бросая aNullReferenceException
.StringComparison
тип. В случае сравнения строк это означаетString.Equals
.NullReferenceException
вы можете просто использовать статический метод:String.Equals(string1, string2, StringComparison.Ordinal)
.Ответы:
InvariantCulture
Использует «стандартный» набор порядков символов (a, b, c, ... и т. Д.). Это отличается от некоторых конкретных локалей, которые могут сортировать символы в разных порядках («с острым» может быть до или после «а», в зависимости от локали и т. Д.).
порядковый
С другой стороны, смотрит чисто на значения необработанных байтов, которые представляют символ.
На http://msdn.microsoft.com/en-us/library/e6883c06.aspx есть отличный пример , показывающий результаты различных значений StringComparison. Весь путь в конце показывает (отрывок):
Вы можете видеть, что там, где доходность InvariantCulture (U + 0069, U + 0049, U + 00131), порядковая доходность (U + 0049, U + 0069, U + 00131).
источник
Это имеет значение, например, есть такая вещь, как расширение персонажа
С
InvariantCulture
символом ß расширяется до ss.источник
Ordinal
иInvariantCulture
? Вот о чем идет речь в оригинальном вопросе.ß
следует отметить, что,ß
по крайней мере, по-немецки равно двойной s, Источник: en.wikipedia.org/wiki/%C3%9Fß
иss
взаимозаменяемо на немецком языке (я носитель языка). Есть случаи, когда оба являются законными (но часто один устарел / не рекомендуется), и есть случаи, когда разрешена только одна форма.Указание на рекомендации по использованию строк в .NET Framework :
StringComparison.Ordinal
илиStringComparison.OrdinalIgnoreCase
для сравнения в качестве безопасного значения по умолчанию для сопоставления строк, не зависящего от культуры.StringComparison.Ordinal
илиStringComparison.OrdinalIgnoreCase
для лучшей производительности.StringComparison.Ordinal
илиStringComparison.OrdinalIgnoreCase
значения вместо строковых операций в зависимости от того,CultureInfo.InvariantCulture
когда сравнение не имеет лингвистического значения (например, символическое).И наконец:
StringComparison.InvariantCulture
большинстве случаев . Одно из немногих исключений - когда вы сохраняете лингвистически значимые, но культурно-независимые данные.источник
Еще одно удобное отличие (на английском языке, где акценты встречаются редко) заключается в том, что сравнение InvariantCulture сначала сравнивает целые строки без учета регистра, а затем, если необходимо (и запрашивается), различает регистр после первого сравнения только по разным буквам. (Конечно, вы также можете сделать сравнение без учета регистра, которое не будет различаться в каждом конкретном случае.) Исправлено:Акцентированные буквы считаются другой разновидностью тех же букв, и строка сравнивается сначала без учета акцентов, а затем учитывает их, если все общие буквы совпадают (во многом как с другим регистром, за исключением того, что в конечном итоге не игнорируется при сравнении без учета регистра). Эта группа акцентирует версии одного и того же слова рядом друг с другом, а не полностью разделяется при первой разнице в акценте. Это порядок сортировки, который вы обычно находите в словаре, где заглавные слова появляются рядом с их строчными эквивалентами, а акцентированные буквы - рядом с соответствующей безударной буквой.
Порядковое сравнение строго сравнивает числовые значения символов, останавливаясь на первом разнице. Это сортирует заглавные буквы полностью отдельно от строчных букв (и ударные буквы, по-видимому, отдельно от них), поэтому слова с заглавными буквами не сортируются ни в какое сравнение с их строчными эквивалентами.
InvariantCulture также считает, что заглавные буквы больше, чем строчные, в то время как Ordinal считает заглавные буквы меньше строчных (пережиток ASCII со старых времен, когда компьютеры имели строчные буквы, прописные буквы были выделены первыми и, следовательно, имели более низкие значения, чем строчные буквы добавлю позже).
Например, по ординалу:
"0" < "9" < "A" < "Ab" < "Z" < "a" < "aB" < "ab" < "z" < "Á" < "Áb" < "á" < "áb"
И по InvariantCulture:
"0" < "9" < "a" < "A" < "á" < "Á" < "ab" < "aB" < "Ab" < "áb" < "Áb" < "z" < "Z"
источник
Хотя вопрос заключается в равенстве , для быстрой визуальной ссылки, здесь порядок некоторых строк отсортирован с использованием нескольких культур, иллюстрирующих некоторые специфические особенности.
Замечания:
de-DE
,ja-JP
Иen-US
вроде так же , какInvariant
только видыss
и вß
отличие от вышеупомянутых трех культурda-DK
сортирует совсем по другомуIgnoreCase
вопросы флаг для всех отобранных культурКод, использованный для генерации таблицы выше:
источник
CultureComparer
которую мы могли бы использовать проверить. Для этой таблицыDanish
культура (инфо) оказалась очень важной.)Инвариант - это лингвистически подходящий тип сравнения.
Порядковый номер - это двоичный тип сравнения. (быстрее)
См. http://www.siao2.com/2004/12/29/344136.aspx
источник
Вот пример, где сравнение равенства строк с использованием InvariantCultureIgnoreCase и OrdinalIgnoreCase не даст одинаковых результатов:
Если вы запустите это, equals1 будет false, а equals2 будет true.
источник
a="\x00e9"
(e острый) иb="\x0065\x0301"
(e в сочетании с острым акцентом)StringComparer.Ordinal.Equals(a, b)
вернет false, аStringComparer.InvariantCulture.Equals(a, b)
вернет true.Не нужно использовать причудливые примеры символов Unicode, чтобы показать разницу. Вот один простой пример, который я обнаружил сегодня, который удивителен и состоит только из символов ASCII.
Согласно таблице ASCII,
0
(0x48) меньше, чем_
(0x95) при обычном сравнении. InvariantCulture сказал бы обратное (код PowerShell ниже):источник
Всегда старайтесь использовать InvariantCulture в тех строковых методах, которые принимают его как перегрузку. Используя InvariantCulture вы на безопасной стороне. Многие программисты .NET могут не использовать эту функциональность, но если ваше программное обеспечение будет использоваться разными культурами, InvariantCulture - чрезвычайно удобная функция.
источник