Является StringComparison.Ordinal так же, как InvariantCulture для проверки равенства?

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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