StringComparison.Ordinal такой же, как InvariantCulture для проверки равенства? - PullRequest
19 голосов
/ 13 января 2011

Из их краткого описания, похоже, что правила сравнения строк StringComparison.Ordinal и StringComparison.InvariantCulture должны отличаться тем, как они сортируют строк.Это все ?то есть означает ли это, что мы можем использовать любое правило сравнения строк при выполнении сравнения на равенство?

string.Equals(a, b, StringComparison....)

И для дополнительного кредита: имеет ли значение ответ, если мы сравниваем OrdinalIgnoreCase и InvariantCultureIgnoreCase?Как?

Пожалуйста, предоставьте вспомогательный аргумент и / или ссылки.

Ответы [ 3 ]

22 голосов
/ 20 ноября 2013

Это имеет значение, например, есть вещь, называемая расширением символов

    var s1 = "Strasse";
    var s2 = "Straße";

    s1.Equals(s2, StringComparison.Ordinal);          // false
    s1.Equals(s2, StringComparison.InvariantCulture); // true

С InvariantCulture символ ß расширяется до ss.

6 голосов
/ 13 января 2011

Ну, это, безусловно, имеет значение.Когда вы используете сравнение «игнорировать регистр», вы вызываете довольно большой кусок кода в .NET Framework, который знает, как работают правила оболочки в текущей культуре.Правила, которые очень интересны для гика бывшего коллекционера почтовых марок, таких как я, есть несколько довольно странных правил в зависимости от того, куда вы смотрите.Турецкая проблема I известна, парни Unicode должны были сделать для них явное исключение.

На самом деле это не код, это таблицы поиска.Это само по себе интересно, потому что для поддержки компилятора C # требуется MSFT для поддержки параметра командной строки / linkres.Опция компиляции, которую вы не можете использовать в своих собственных проектах.Он предназначен только для того, чтобы mscorlib мог найти файлы .nlp, таблицы преобразования для правил культуры.Сохраненный в том же подкаталоге GAC, что и mscorlib.dll, эффект опции компиляции.

Но я отвлекся.Само собой разумеется, что StringComparison.OrdinalIgnoreCase немного быстрее, чем StringComparison.InvariantCultureIgnoreCase.Просто потому, что «инвариант» означает США, дом MSFT.Трудно измерить, это происходит в наносекундах.StringComparison.CurrentCultureIgnoreCase попадает в эти таблицы перевода.Смертельно медленно, когда вы впервые используете его, просто медленнее, когда вы используете их позже.

4 голосов
/ 13 января 2011

За дополнительный кредитный вопрос

...