Подтвердить что ты не робот

Какую версию StringComparer использовать

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

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

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

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

Ответ 1

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

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

Ответ 2

Существует три вида сравнения:

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

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

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

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

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

Ссылки

Ответ 3

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

Дополнительную информацию см. в этом блоге.

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

System.Collections.Specialized включает StringDictionary. Раздел "Замечания" состояний MSDN "Ключ не может быть нулевым, но может иметь значение.

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

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