Я знаю, что следующий чувствителен к регистру:Есть ли регистр C# без учета оператора?
if (StringA == StringB) {
Так есть оператор, который будет сравнить две строки в нечувствительным образом?
Я знаю, что следующий чувствителен к регистру:Есть ли регистр C# без учета оператора?
if (StringA == StringB) {
Так есть оператор, который будет сравнить две строки в нечувствительным образом?
Попробуйте это:
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
Я относительный новичок StackOverflow - вы можете объяснить, что вы подразумеваете, добавив ссылку? Вы имеете в виду документы MSDN? –
черт возьми, вы быстро .. lol Я печатал ответ, который у вас был первым = D – Erick
Вы можете добавить ссылку MSDN (что я обычно делаю), или если вы найдете какие-нибудь интересные сообщения в блоге или такие, которые могут расширить ответ. – Samuel
System.Collections.CaseInsensitiveComparer
или
System.StringComparer.OrdinalIgnoreCase
Влияет ли это на все приложение? – GateKiller
Нет, только когда вы его используете. – leppie
Где я могу найти дополнительную информацию об этом. Означает ли это, что я могу использовать == для нечувствительного к регистру соответствия? – GateKiller
оператора? НЕТ, но я думаю, вы можете изменить свою культуру, чтобы сравнение строк не зависело от регистра.
// you'll want to change this...
System.Threading.Thread.CurrentThread.CurrentCulture
// and you'll want to custimize this
System.Globalization.CultureInfo.CompareInfo
Я уверен, что это изменит способ сравнения строк с помощью оператора equals.
Это немного уродливый хак imho ... –
Да уж, по крайней мере, это совсем не то, что вы хотели бы сделать, если не хотите, чтобы все сравнения строк были нечувствительны к регистру. Но я думаю, что это изменяет поведение оператора равенства. –
string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase);
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {
Люди сообщают ToUpperInvariant() быстрее, чем ToLowerInvariant().
Инвариант может быть плохой идеей, если текущая или желаемая культура имеет специальные правила для верхнего корпуса. – OregonGhost
И семантика тоже отличается. – leppie
Создает ли это новую копию каждой строки? Если да, то плохая идея. – cjk
Вы можете использовать
if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase))
или
if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) {
но вы должны быть уверены, что StringA не является нулевым. Так, вероятно, лучше использовать тот:
string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase);
как Джон предложило
EDIT: исправлена ошибка
string.Compare(string1, string2, true)
У этого могут быть проблемы I18N. –
Есть целый ряд свойств на статическом классе StringComparer
, которые возвращают компараторы для любого типа чувствительность к регистру, которую вы, возможно, захотите:
Например, вы можете вызвать
StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2)
или
StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2)
Это немного чище, чем string.Equals
или string.Compare
перегрузками, которые принимают StringComparison
аргумент.
Я так привык к типизации в конце этих методов сравнения: , StringComparison.
Так что я сделал расширение.
namespace System
{ public static class StringExtension
{
public static bool Equals(this string thisString, string compareString,
StringComparison stringComparison)
{
return string.Equals(thisString, compareString, stringComparison);
}
}
}
Сразу отметим, что вам нужно будет проверить на нуль thisString
до вызова доб.
Лучший способ сравнить 2 строки, игнорируя случай букв, чтобы использовать статический метод String.Equals, определяющий порядковое сравнение строк порядка. Это также самый быстрый способ, намного быстрее, чем преобразование строк в нижний или верхний регистр и их сравнение после этого.
Я проверил производительность обоих подходов, а сравнение порядковых номеров игнорирования было более чем в 9 раз быстрее! Он также более надежный, чем преобразование строк в нижний или верхний регистр (проверьте проблему с турецким i). Поэтому всегда используйте метод String.Equals для сравнения строк равенства:
String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase);
Если вы хотите, чтобы выполнить культуру конкретной сравнения строк можно использовать следующий код:
String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase);
Пожалуйста, обратите внимание, что второй пример использования логика сравнения строк текущей культуры, которая делает ее более медленной, чем сравнение «порядкового игнорирования» в первом примере, поэтому, если вам не нужна какая-либо конкретная логика сравнения строк, а вы после максимальной производительности, используйте " порядковый игнорировать случай "сравнение.
Для получения дополнительной информации, read the full story on my blog.
Не предлагайте 'ToLower' или' ToLowerInvariant': они создают память только для выполнения сравнения, и они могут терпеть неудачу при добавлении новых наборов символов в unicode. «ToUpper» терпит неудачу из-за турецкого «i», среди прочих; нет причин, по которым «Толауэр» не пойдет на убыль в будущем по тем же причинам. – antiduh
@antiduh, спасибо за ваш комментарий. Большинство из нас знают об этих потенциальных проблемах, многие учебные пособия через Интернет дают турецкий «я» в качестве примера. Как вы видите в моем посте, я не рекомендую использовать методы «ToLower» или «ToLowerInvariant», я просто хотел показать, насколько эффективнее метод String.Equals. –
«Большинство из нас знают об этих потенциальных проблемах, многие учебники по Интернету дают« я »в качестве примера» - недостаточно людей, и вы все еще упоминаете это как второе предложение в своем ответе. Кроме того, ваш * ответ * не содержит достаточного обоснования, чтобы никогда не использовать его - вы просто указываете производительность; производительность не всегда является основным приоритетом. В результате вы в настоящее время нарушаете рекомендации Справочного центра; ссылки на внешние сайты прекрасны, но вы недостаточно суммировали контент (проблема turkish 'i'). Это не ваша рекламная платформа. – antiduh
Другие ответы здесь полностью применимы, но почему-то требуется некоторое время для ввода StringComparison.OrdinalIgnoreCase
, а также с использованием String.Compare
.
Я закодирован простой метод расширения строки, где можно указать, если сравнение чувствительна к регистру или случай бессмысленного с булевым - см следующего ответа:
возможного дубликат [регистронезависмо сравнением строк в C#] (http://stackoverflow.com/questions/501906/caselessly-comparing-strings-in-c-sharp) – nawfal
Если кто-то наткнулся на этот вопрос, ища нечувствительное к регистру сравнение для Словаря, взгляните на этот вопрос здесь: [Нечувствительный к регистру доступ для общего словаря] (http://stackoverflow.com/questions/13230414/case-insensitive-access-for-generic-dic –
Robotnik
Было бы очень приятно; скажем, определить соответствующий '~ =' для параллельного '==' как версию без учета регистра. – eidylon