2009-03-10 3 views
131

Я знаю, что следующий чувствителен к регистру:Есть ли регистр C# без учета оператора?

if (StringA == StringB) { 

Так есть оператор, который будет сравнить две строки в нечувствительным образом?

+0

возможного дубликат [регистронезависмо сравнением строк в C#] (http://stackoverflow.com/questions/501906/caselessly-comparing-strings-in-c-sharp) – nawfal

+0

Если кто-то наткнулся на этот вопрос, ища нечувствительное к регистру сравнение для Словаря , взгляните на этот вопрос здесь: [Нечувствительный к регистру доступ для общего словаря] (http://stackoverflow.com/questions/13230414/case-insensitive-access-for-generic-dic – Robotnik

+0

Было бы очень приятно; скажем, определить соответствующий '~ =' для параллельного '==' как версию без учета регистра. – eidylon

ответ

240

Попробуйте это:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase); 
+0

Я относительный новичок StackOverflow - вы можете объяснить, что вы подразумеваете, добавив ссылку? Вы имеете в виду документы MSDN? –

+0

черт возьми, вы быстро .. lol Я печатал ответ, который у вас был первым = D – Erick

+0

Вы можете добавить ссылку MSDN (что я обычно делаю), или если вы найдете какие-нибудь интересные сообщения в блоге или такие, которые могут расширить ответ. – Samuel

14
System.Collections.CaseInsensitiveComparer 

или

System.StringComparer.OrdinalIgnoreCase 
+0

Влияет ли это на все приложение? – GateKiller

+0

Нет, только когда вы его используете. – leppie

+2

Где я могу найти дополнительную информацию об этом. Означает ли это, что я могу использовать == для нечувствительного к регистру соответствия? – GateKiller

3

оператора? НЕТ, но я думаю, вы можете изменить свою культуру, чтобы сравнение строк не зависело от регистра.

// you'll want to change this... 
System.Threading.Thread.CurrentThread.CurrentCulture 
// and you'll want to custimize this 
System.Globalization.CultureInfo.CompareInfo 

Я уверен, что это изменит способ сравнения строк с помощью оператора equals.

+4

Это немного уродливый хак imho ... –

+0

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

9
string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase); 
0
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) { 

Люди сообщают ToUpperInvariant() быстрее, чем ToLowerInvariant().

+1

Инвариант может быть плохой идеей, если текущая или желаемая культура имеет специальные правила для верхнего корпуса. – OregonGhost

+0

И семантика тоже отличается. – leppie

+0

Создает ли это новую копию каждой строки? Если да, то плохая идея. – cjk

3

Вы можете использовать

if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase)) 
7

или

if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) { 

но вы должны быть уверены, что StringA не является нулевым. Так, вероятно, лучше использовать тот:

string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase); 

как Джон предложило

EDIT: исправлена ​​ошибка

0
string.Compare(string1, string2, true) 
+1

У этого могут быть проблемы I18N. –

16

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

StringComparer Properties

Например, вы можете вызвать

StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2) 

или

StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2) 

Это немного чище, чем string.Equals или string.Compare перегрузками, которые принимают StringComparison аргумент.

2

Я так привык к типизации в конце этих методов сравнения: , 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 до вызова доб.

18

Лучший способ сравнить 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.

+0

Не предлагайте 'ToLower' или' ToLowerInvariant': они создают память только для выполнения сравнения, и они могут терпеть неудачу при добавлении новых наборов символов в unicode. «ToUpper» терпит неудачу из-за турецкого «i», среди прочих; нет причин, по которым «Толауэр» не пойдет на убыль в будущем по тем же причинам. – antiduh

+0

@antiduh, спасибо за ваш комментарий. Большинство из нас знают об этих потенциальных проблемах, многие учебные пособия через Интернет дают турецкий «я» в качестве примера. Как вы видите в моем посте, я не рекомендую использовать методы «ToLower» или «ToLowerInvariant», я просто хотел показать, насколько эффективнее метод String.Equals. –

+3

«Большинство из нас знают об этих потенциальных проблемах, многие учебники по Интернету дают« я »в качестве примера» - недостаточно людей, и вы все еще упоминаете это как второе предложение в своем ответе. Кроме того, ваш * ответ * не содержит достаточного обоснования, чтобы никогда не использовать его - вы просто указываете производительность; производительность не всегда является основным приоритетом. В результате вы в настоящее время нарушаете рекомендации Справочного центра; ссылки на внешние сайты прекрасны, но вы недостаточно суммировали контент (проблема turkish 'i'). Это не ваша рекламная платформа. – antiduh

0

Другие ответы здесь полностью применимы, но почему-то требуется некоторое время для ввода StringComparison.OrdinalIgnoreCase, а также с использованием String.Compare.

Я закодирован простой метод расширения строки, где можно указать, если сравнение чувствительна к регистру или случай бессмысленного с булевым - см следующего ответа:

https://stackoverflow.com/a/49208128/2338477

Смежные вопросы