Какую версию StringComparer использовать - PullRequest
20 голосов
/ 09 октября 2008

Если я хочу иметь нечувствительный к регистру словарь со строковыми ключами, какую версию StringComparer мне следует использовать с учетом этих ограничений:

  • Ключи в словаре взяты из кода C # или конфигурационных файлов, написанных только на английском языке (США или Великобритания)
  • Программное обеспечение интернационализировано и будет работать в разных регионах

Я обычно использую StringComparer.InvariantCultureIgnoreCase, но не был уверен, что это правильный случай. Вот пример кода:

Dictionary< string, object> stuff = new Dictionary< string, object>(StringComparer.InvariantCultureIgnoreCase);

Ответы [ 7 ]

31 голосов
/ 10 октября 2008

Есть три вида компараторов:

  • Культура известно
  • Культурный инвариант
  • Порядковый

Каждый компаратор имеет регистрозависимую , а также регистрозависимую версию.

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

A учитывающий культуру компаратор учитывает аспекты, специфичные для культуры текущего потока. Он знает проблемы "Turkish i", "Spanish LL" и т. Д. Он должен использоваться для строк пользовательского интерфейса.

Сравнительный инвариант для культуры на самом деле не определен и может давать непредсказуемые результаты, поэтому его вообще не следует использовать.

Ссылки

  1. Новые рекомендации по использованию строк в Microsoft .NET 2.0
12 голосов
/ 10 октября 2008

Эта статья MSDN охватывает все, что вы, возможно, захотите узнать очень подробно, включая проблему Turkish-I.

Прошло много времени с тех пор, как я прочитал это, поэтому я собираюсь сделать это снова. Увидимся через час!

3 голосов
/ 09 октября 2008

Понятие "нечувствительный к регистру" является лингвистическим, и поэтому без культуры не имеет смысла.

См. блог для получения дополнительной информации.

Тем не менее, если вы просто говорите о строках с использованием латинского алфавита, то вам, вероятно, сойдет с рук InvariantCulture.

Вероятно, лучше всего создать словарь с помощью StringComparer.CurrentCulture. Это позволит "ß" соответствовать "ss" в вашем словаре в соответствии с немецкой культурой, например.

1 голос
/ 09 октября 2008

StringComparer.OrdinalIgnoreCase немного быстрее, чем InvariantCultureIgnoreCase FWIW («Порядковое сравнение быстрое, но нечувствительное к культуре» согласно MSDN .

Вы должны были бы сделать много сравнений, чтобы заметить разницу, конечно.

1 голос
/ 09 октября 2008

Поскольку ключи - это ваши известные фиксированные значения, то должны работать либо InvariantCultureIgnoreCase, либо OrdinalIgnoreCase. Избегайте культурно-специфических, или вы можете столкнуться с некоторыми из более "забавных" вещей, таких как проблема "Turkish i". Очевидно, вы бы использовали культурный компаратор, если бы сравнивали культурные значения ... но похоже, что это не так.

0 голосов
/ 14 октября 2008

System.Collections.Specialized включает StringDictionary. Раздел «Примечания» в MSDN гласит: «Ключ не может быть нулевым, но может иметь значение.

Ключ обрабатывается без учета регистра; перед использованием в словаре строк он переводится в нижний регистр.

В .NET Framework версии 1.0 этот класс использует сравнение строк с учетом культурных особенностей. Однако в .NET Framework версии 1.1 и выше этот класс использует CultureInfo.InvariantCulture при сравнении строк. Для получения дополнительной информации о том, как культура влияет на сравнения и сортировку, см. Сравнение и сортировка данных для конкретной культуры и выполнение нечувствительных к культуре операций со строками.

0 голосов
/ 09 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...