Какой случай использовать при сравнении строк в языках программирования Microsoft? - PullRequest
2 голосов
/ 25 июня 2009

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

Когда я сравнивал две строки неизвестного случая, я помню, что читал, что основанные на Microsoft методы преобразования были оптимизированы для прописных, а не строчных букв. Итак:

If (stringA.ToUpper() == stringB.ToUpper()) { ... }

будет быстрее, чем:

If (stringA.ToLower() == stringB.ToLower()) { ... }

Если это так, было бы лучше хранить строковые данные в верхнем, а не в нижнем регистре, когда вам нужно искать их?

Ответы [ 3 ]

11 голосов
/ 25 июня 2009

В .NET мы можем сделать что-то вроде следующего:

if (String.Compare(stringA, stringB, StringComparison.InvariantCultureIgnoreCase) == 0) {...}

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

3 голосов
/ 25 июня 2009

В общем случае нет безопасного случая для использования.

Какой бы выбор вы ни сделали, он в некоторых случаях потерпит неудачу.

  • У некоторых языков нет регистра (на самом деле это не проблема).
  • У некоторых языков есть третий случай "заголовка".
  • Некоторые персонажи не туда и обратно, например, ToUpper ("ß") - это "SS", а ToLower ("SS") - это "ss", но есть некоторые слова, которые только искажаются "ß" против "ss", поэтому будет давать ложное срабатывание, сопоставляемое с отображением на верхний case (и который нарушит предположения о том, что отображение case не меняет длины строк).
  • Отображение регистра зависит от языка. Например. ToLower («I») - «i», если вы не работаете на турецком или азари, где результатом является «ı» (латинская строчная буква I без точек) и ToUpper («i») - «İ» (латинская заглавная буква I с точкой выше).

В прошлом подходы основывались на ToUpper и ToLower, где делались предположения о работе только с английским текстом и игнорировались глифы и символы большинства миров. Чтобы быть более осведомленным, вы должны использовать таблицы сопоставления случаев в качестве основы для сравнения без учета регистра.

0 голосов
/ 25 июня 2009

В кодах ANSI / ASCII заглавные буквы имеют более низкие значения, чем строчные. «A» - это код 65, а «a» - это код 97. Двоичные 01000001 и 01100001.) Таким образом, разница между строчными и заглавными буквами составляет один бит.
Но имеет ли это значение для скорости? Во всех случаях все 8 бит должны сравниваться. Таким образом, любая разница в скорости может быть объяснена, если сравнение двух битов происходит быстрее, если оба бита равны 0. Это не имеет особого смысла для меня, но, опять же, в некоторых старых процессорах это могло быть так в прошлом.
А сегодня? Я не думаю, что вы заметите разницу.


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