Почему строка в .net чувствительна к регистру по умолчанию? - PullRequest
0 голосов
/ 14 декабря 2010

В большинстве случаев я хочу делать сравнения строк, я хочу, чтобы они были без учета регистра.

Так почему же строки в .net по умолчанию чувствительны к регистру?

РЕДАКТИРОВАТЬ 1: Чтобы было ясно, я думаю, что ниже должно возвращаться true по умолчанию.Или, по крайней мере, позвольте мне иметь флаг времени компиляции, который делает его таким.

"John Smith" == "JOHN SMITH" 

РЕДАКТИРОВАТЬ 2: Я могу придумать еще много примеров того, что должно быть без учета регистра

Примеры вещей, которые следует учитывать без учета регистра

  • Имена пользователей
  • URL
  • Расширения файлов / Имена файлов / Имена каталогов / Пути
  • Machine / servernames
  • Штат / Страна / Местоположение и т. Д.
  • Имя / Фамилия / Инициалы
  • Направляющие
  • Названия месяцев / дней

Примеры вещей, которые должны учитывать регистр

  • Пароли

Ответы [ 8 ]

4 голосов
/ 14 декабря 2010

Извините за банальный ответ, но так оно и есть :)

На базовом уровне строки представляются в виде списка символов, где «a» отличается от «A», так что это, вероятно, самое простое представление \ соглашение в целом. В вашем случае, вероятно, справедливо будет сказать, что большинство сравнений не учитывает регистр, но я думаю, что другая сторона аргумента верна, по крайней мере, в той же степени, и соглашение принято.

Я полагаю, что использование некоторых вспомогательных методов \ классов немного облегчит вашу боль.

2 голосов
/ 26 июля 2013

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

StringComparison.OrdinalIgnoreCase
StringComparison.InvariantCultureIgnoreCase
StringComparison.CurrentCultureIgnoreCase

У них совершенно разные варианты использования. Вы, вероятно, не заметили так много, потому что вы имеете дело с ASCII изо дня в день. Пользователи в других регионах видят больше различий.

1 голос
/ 14 декабря 2010

Сравнение строк в .Net чувствительно к регистру, потому что строки (и отдельные символы) по своей сути чувствительны к регистру.

Символ 'a' хранится внутри с другим значением ASCII или Unicode как 'A',Утверждение, что «a» совпадает с «A», не является «правильным».

Это различие становится критическим при сравнении значений на языках, отличных от английского, при использовании алгоритмов, таких как хеш-таблицы, или при использовании большого количества шифрованияалгоритмы расшифровки.

Мои два цента: сравнение с учетом регистра по умолчанию, потому что это правильно.

1 голос
/ 14 декабря 2010

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

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

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

0 голосов
/ 23 июня 2015

Я знаю, что это некропостинг, но

Я пришел сюда в поисках решения той же проблемы.Сейчас прошло почти 5 лет ... но я не против, так как это один из первых результатов поиска, и я думаю, что было бы лучше включить правильную информацию.

Согласно это MSDNpage вам просто нужно добавить 1 строку кода в ваш файл:

Option Compare Text

Если вы добавляете вышеуказанную строку в начало вашего ядра, вы говорите CLR переключиться со значения по умолчанию (Option Compare Binary) к сравнению без учета регистра.

Я не знаю, может ли это работать в C #.

0 голосов
/ 14 декабря 2010

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

Сопоставление примечаний с учетом регистра очень просто. Фактически метод equals строки имеет перегрузку специально для указания способа сравнения.

0 голосов
/ 14 декабря 2010

Вы не можете изменить поведение существующих классов.System.String класс, который определен в mscorelib / system.core, переопределяет == и определяет равенство с учетом регистра.

Все, что вы можете сделать, это добавить метод расширения в строку и реализовать регистр без учета регистра:

public static class StringEqualityExtension
{
    public static bool StringEquals(this string value, string other)
    {
       return value.ToLower()==other.ToLower();
    } 
}

// usage
string myString = "Some112";
string other = "sOME112";

bool equal = myString.StringEquals(myString);
0 голосов
/ 14 декабря 2010

В VB.NET можно установить «сравнение параметров» для текста, чтобы оно работало без учета регистра, но я настоятельно не рекомендую это делать. Мое любимое - просто использовать метод string.toLower (), когда мне нужно сравнивать без учета текста и читать строчную версию текста.

Почему? Потому что как бы вы сравнили, когда чувствительность к регистру имеет значение, как в некоторых приложениях?

...