Я новичок в StackOverflow. Можете ли вы объяснить, что вы имеете в виду, добавив ссылку? Вы имеете в виду документы MSDN?
Джон Феминелла
55
Если вы хотите сравнение с учетом культуры, используйте этот метод. Если вы просто хотите убедиться, что «FILE» и «file» оба приняты, используйте «OrdinalIgnoreCase», иначе ваш код может не работать в таких местах, как турецкие локали. Для получения дополнительной информации см. Moserware.com/2008/02/does-your-code-pass-turkey-test.html
Джефф Мозер,
10
Не уверен, о чем говорит Самуил ... этот ответ идеален. Это правильно и само за себя. Это не нуждается в ссылках. +1
Парусный спорт по дзюдо
3
Ага, это такой ужасный глоток! моя клавиатура изнашивается. Прошли те времена, когда я могу использовать " if A$=B$ then goto 10"
Санджай Манохар
9
@Sanjay Manohar Тогда напишите пользовательский оператор - и я бы порекомендовал лучшую клавиатуру.
Rushyo
37
Лучший способ сравнить 2 строки, игнорируя регистр букв, - это использовать статический метод String.Equals, определяющий порядковое игнорирование сравнения строк регистра. Это также самый быстрый способ, гораздо быстрее, чем преобразование строк в нижний или верхний регистр и сравнение их после этого.
Я проверил производительность обоих подходов, и сравнение строк в регистре игнорирования было более чем в 9 раз быстрее ! Это также более надежно, чем преобразование строк в нижний или верхний регистр (см. Проблему Turkish i). Поэтому всегда используйте метод String.Equals для сравнения строк на равенство:
Обратите внимание, что во втором примере используется логика сравнения строк текущей культуры, что делает его медленнее, чем сравнение «порядкового игнорирования регистра» в первом примере, поэтому если вам не нужна логика сравнения строк для конкретной культуры, и вы после максимальной производительности используйте сравнение «порядковый номер игнорирования».
Не предлагайте ToLowerили ToLowerInvariant: они создают память только для выполнения сравнения, и они могут потерпеть неудачу, когда новые наборы символов добавляются в юникод. ToUpperтерпит неудачу из-за турецкого «я», среди других; нет причин, почему ToLowerне потерпит неудачу в будущем по тем же причинам.
антидух
@antiduh, спасибо за ваш комментарий. Большинство из нас знают об этих потенциальных проблемах, многие учебники по Интернету приводят турецкое «я» в качестве примера. Как вы видите в моем посте, я не рекомендую использовать методы ToLowerили ToLowerInvariantметоды, я просто хотел показать, насколько более эффективен этот String.Equalsметод.
Павел Владов
3
«Большинство из нас знают об этих потенциальных проблемах, многие учебники по Интернету приводят турецкое« я »в качестве примера», - мало людей, и вы все еще упоминаете это как второе предложение в своем ответе. Кроме того, ваш ответ не содержит достаточного обоснования, чтобы никогда не использовать его - вы просто упоминаете производительность; производительность не всегда является конечным приоритетом. В результате вы в настоящее время нарушаете правила справочного центра; ссылки на внешние сайты в порядке, но вы недостаточно суммировали содержание (турецкая проблема «i»). ТАК не ваша рекламная площадка.
антидух
20
В StringComparerстатическом классе есть ряд свойств, которые возвращают компараторы для любого типа чувствительности к регистру:
Оператор? НЕТ, но я думаю, что вы можете изменить свою культуру, чтобы сравнение строк не учитывало регистр.
// you'll want to change this...System.Threading.Thread.CurrentThread.CurrentCulture// and you'll want to custimize thisSystem.Globalization.CultureInfo.CompareInfo
Я уверен, что это изменит способ сравнения строк оператором equals.
Да, по меньшей мере, это совершенно не то, что вы хотели бы сделать, если вы не хотите, чтобы все сравнения строк были без учета регистра. Но я думаю, что это меняет поведение оператора равенства.
В то время как я , как чистый ищут синтаксис использования, это немного вводит в заблуждении ( IgnoreCaseпротив IgnoreCaseString) и неоднозначной (Java выбирает неявную распаковку против неявного бокса , поэтому я считаю , это не будет работать в Java с неявными литом обратно в строку в там). И это создает накладные расходы памяти 2 новых объектов с выполнением дерева вызовов для каждого сравнения, перепрыгивая через несколько вложенных вызовов методов для отображаемого варианта использования. Тем не менее, в большинстве случаев производительность, вероятно, достаточно хорошая.
Arkaine55
Хотя это умная идея, она не очень разумна с точки зрения ремонтопригодности. Вы фактически создаете суррогатный строковый тип вместо использования встроенного системного строкового типа. Программист, который придет позже, не поймет, что происходит с первого взгляда, и тогда он / она будет ругаться на вас. Использование string.Equals () не так уж и плохо, и большинство людей поймут, что он делает.
нтколонель
1
Я так привык печатать в конце этих методов сравнения: , StringComparison.
Инвариант может быть плохой идеей, если текущая или желаемая культура имеет специальные правила для заглавных букв.
OregonGhost
Создает ли это новую копию каждой строки? Если так, плохая идея.
cjk
1
Это также вызовет исключение, если одна (или обе) строки будут нулевыми.
tvanfosson
3
С точки зрения производительности это не очень хорошее решение, так как здесь вы также создадите 2 новых экземпляра строки.
Фредерик Гейселс
0
Другие ответы здесь полностью действительны, но каким-то образом требуется некоторое время, чтобы напечатать, StringComparison.OrdinalIgnoreCaseа также использовать String.Compare.
Я написал простой метод расширения String, в котором вы можете указать, является ли сравнение чувствительным к регистру или бессмысленным с логическим значением - см. Следующий ответ:
~=
параллели==
в качестве версии без учета регистра.Ответы:
Попробуй это:
источник
if A$=B$ then goto 10
"Лучший способ сравнить 2 строки, игнорируя регистр букв, - это использовать статический метод String.Equals, определяющий порядковое игнорирование сравнения строк регистра. Это также самый быстрый способ, гораздо быстрее, чем преобразование строк в нижний или верхний регистр и сравнение их после этого.
Я проверил производительность обоих подходов, и сравнение строк в регистре игнорирования было более чем в 9 раз быстрее ! Это также более надежно, чем преобразование строк в нижний или верхний регистр (см. Проблему Turkish i). Поэтому всегда используйте метод String.Equals для сравнения строк на равенство:
Если вы хотите выполнить сравнение строк для конкретной культуры, вы можете использовать следующий код:
Обратите внимание, что во втором примере используется логика сравнения строк текущей культуры, что делает его медленнее, чем сравнение «порядкового игнорирования регистра» в первом примере, поэтому если вам не нужна логика сравнения строк для конкретной культуры, и вы после максимальной производительности используйте сравнение «порядковый номер игнорирования».
Для получения дополнительной информации прочитайте полную историю в моем блоге .
источник
ToLower
илиToLowerInvariant
: они создают память только для выполнения сравнения, и они могут потерпеть неудачу, когда новые наборы символов добавляются в юникод.ToUpper
терпит неудачу из-за турецкого «я», среди других; нет причин, почемуToLower
не потерпит неудачу в будущем по тем же причинам.ToLower
илиToLowerInvariant
методы, я просто хотел показать, насколько более эффективен этотString.Equals
метод.В
StringComparer
статическом классе есть ряд свойств, которые возвращают компараторы для любого типа чувствительности к регистру:StringComparer
свойстваНапример, вы можете позвонить
или
Это немного чище, чем
string.Equals
илиstring.Compare
перегрузки, которые принимаютStringComparison
аргумент.источник
или
источник
источник
или
но вы должны быть уверены, что StringA не является нулевым. Поэтому, вероятно, лучше использовать ту:
как предположил Джон
РЕДАКТИРОВАТЬ: исправлена ошибка
источник
Ты можешь использовать
источник
Оператор? НЕТ, но я думаю, что вы можете изменить свою культуру, чтобы сравнение строк не учитывало регистр.
Я уверен, что это изменит способ сравнения строк оператором equals.
источник
Вот идея упростить синтаксис:
Можно использовать как:
источник
IgnoreCase
противIgnoreCaseString
) и неоднозначной (Java выбирает неявную распаковку против неявного бокса , поэтому я считаю , это не будет работать в Java с неявными литом обратно в строку в там). И это создает накладные расходы памяти 2 новых объектов с выполнением дерева вызовов для каждого сравнения, перепрыгивая через несколько вложенных вызовов методов для отображаемого варианта использования. Тем не менее, в большинстве случаев производительность, вероятно, достаточно хорошая.Я так привык печатать в конце этих методов сравнения:
, StringComparison.
Поэтому я сделал расширение.
Просто отметьте, что вам нужно будет проверить наличие нуля
thisString
до вызова ext.источник
источник
Люди сообщают, что ToUpperInvariant () работает быстрее, чем ToLowerInvariant ().
источник
Другие ответы здесь полностью действительны, но каким-то образом требуется некоторое время, чтобы напечатать,
StringComparison.OrdinalIgnoreCase
а также использоватьString.Compare
.Я написал простой метод расширения String, в котором вы можете указать, является ли сравнение чувствительным к регистру или бессмысленным с логическим значением - см. Следующий ответ:
https://stackoverflow.com/a/49208128/2338477
источник