Ответ 1
Эта статья MSDN охватывает все, что вы, возможно, захотите узнать на большой глубине, включая проблему Turkish-I.
Прошло некоторое время с тех пор, как я прочитал его, поэтому я снова это сделаю. Увидимся через час!
Если я хочу иметь несовместимый по строкам словарь с строковыми ключами, какую версию StringComparer следует использовать с учетом этих ограничений:
Я обычно использую StringComparer.InvariantCultureIgnoreCase, но не был уверен, что это правильный случай. Вот пример кода:
Dictionary< string, object> stuff = new Dictionary< string, object>(StringComparer.InvariantCultureIgnoreCase);
Эта статья MSDN охватывает все, что вы, возможно, захотите узнать на большой глубине, включая проблему Turkish-I.
Прошло некоторое время с тех пор, как я прочитал его, поэтому я снова это сделаю. Увидимся через час!
Существует три вида сравнения:
Каждый сравнитель имеет чувствительный к регистру, а также версию без учета регистра.
Компонент порядковый использует порядковые значения символов. Это самый быстрый компаратор, он должен использоваться для внутренних целей.
Компонент , ориентированный на культуру, рассматривает аспекты, специфичные для культуры текущего потока. Он знает проблемы "Turkish i", "Spanish LL" и т.д. Он должен использоваться для строк пользовательского интерфейса.
Компонент инвариант культуры на самом деле не определен и может давать непредсказуемые результаты и поэтому никогда не должен использоваться вообще.
Ссылки
Понятие "без учета регистра" является лингвистическим, и поэтому оно не имеет смысла без культуры.
Дополнительную информацию см. в этом блоге.
Тем не менее, если вы просто говорите о строках, используя латинский алфавит, вы, вероятно, избегаете InvariantCulture.
Возможно, лучше всего создать словарь с помощью StringComparer.CurrentCulture. Это позволит, например, "ß" соответствовать "ss" в вашем словаре под немецкой культурой.
Так как ключи являются вашими известными фиксированными значениями, то должны работать либо InvariantCultureIgnoreCase, либо OrdinalIgnoreCase. Избегайте специфического для культуры, или вы можете поразить некоторые из более "забавных" вещей, таких как проблема "Turkish i". Очевидно, вы использовали бы культурный компаратор, если бы вы сравнивали культурные ценности... но это звучит так, будто вы этого не делаете.
StringComparer.OrdinalIgnoreCase немного быстрее, чем InvariantCultureIgnoreCase FWIW ( "Порядковое сравнение выполняется быстро, но нечувствительно к культуре" в соответствии с MSDN.
Вам нужно будет делать много сравнений, чтобы заметить разницу, конечно.
Инвариантная культура существует специально для обработки строк, которые являются внутренними для программы и не имеют ничего общего с пользовательскими данными или пользовательским интерфейсом. Похоже, что это имеет место для этой ситуации.
System.Collections.Specialized включает StringDictionary. Раздел "Замечания" состояний MSDN "Ключ не может быть нулевым, но может иметь значение.
Ключ обрабатывается без учета регистра; он переводится в нижний регистр, прежде чем он будет использоваться со строковым словарем.
В .NET Framework версии 1.0 этот класс использует чувствительные к культуре сравнения строк. Однако в .NET Framework версии 1.1 и более поздних версиях этот класс использует CultureInfo.InvariantCulture при сравнении строк. Дополнительные сведения о том, как культура влияет на сравнение и сортировку, см. В разделе Сравнение и сортировка данных для конкретной культуры и выполнение операций с нечувствительностью к культуре.