Сравнение строк: InvariantCultureIgnoreCase vs OrdinalIgnoreCase?

Какой код лучше:

int index = fileName.LastIndexOf(".", StringComparison.InvariantCultureIgnoreCase);

или

int index = fileName.LastIndexOf(".", StringComparison.OrdinalIgnoreCase);

Ответ 1

Если вы действительно хотите совместить только точку, тогда CultureInfo.Ordinal будет быстрее, так как нет разницы в событиях.

Ответ 2

Ни один код не всегда лучше. Они делают разные вещи, поэтому они хорошо разбираются в разных вещах.

InvariantCultureIgnoreCase использует правила сравнения на основе английского языка, но без каких-либо региональных вариантов. Это хорошо для нейтрального сравнения, которое все еще учитывает некоторые лингвистические аспекты.

OrdinalIgnoreCase сравнивает коды символов без культурных аспектов. Это полезно для точных сравнений, таких как имена пользователей, но не для сортировки строк с необычными символами типа é или ö. Это также быстрее, потому что перед сравнением нет никаких дополнительных правил.

Ответ 3

FXCop обычно предпочитает OrdinalIgnoreCase. Но ваши требования могут отличаться.

Для английского языка очень мало различий. Это когда вы блуждаете по языкам, которые имеют разные письменные конструкции, что становится проблемой. Я недостаточно опытен, чтобы дать вам больше.

OrdinalIgnoreCase

Возвращаемый StringComparer Основные особенности OrdinalIgnoreCase символы в строках сравнить, как если бы они были преобразованы в верхний регистр с использованием условных обозначений инвариантной культуры, а затем выполняет простое сравнение байтов который не зависит от языка. Это наиболее удобно, если сравнение строк, которые генерируются программно или при сравнении нечувствительные к регистру ресурсы, такие как путей и имен файлов. http://msdn.microsoft.com/en-us/library/system.stringcomparer.ordinalignorecase.aspx

InvariantCultureIgnoreCase

Возвращаемый StringComparer Свойство InvariantCultureIgnoreCase сравнивает строки в лингвистическом который игнорирует случай, но он не подходит для отображения в любом особой культуры. Его основные приложение должно заказывать строки в путь, который будет идентичен культур. http://msdn.microsoft.com/en-us/library/system.stringcomparer.invariantcultureignorecase.aspx

Инвариантная культура - это Объект CultureInfo, возвращаемый Свойство InvariantCulture.

InvariantCultureIgnoreCase свойство фактически возвращает экземпляр анонимного класса, полученного из Класс StringComparer.

Ответ 4

Кажется, вы выполняете сопоставления имен файлов, поэтому я просто добавлю, что OrdinalIgnoreCase ближе всего к тому, что делает NTFS (это не совсем то же самое, но оно ближе, чем InvariantCultureIgnoreCase)