2016-10-06 2 views
1

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

Большая часть моего кода использует

bool output = "foo".ToLower() == "FOO".ToLower(); 

, который кажется немного старомодным для меня. Еще один способ, который я видел много раз:

bool output = Regex.IsMatch("foo", "FOO", RegexOptions.IgnoreCase); 

Я думаю, это возможно, но RegEx не создан для таких простых вещей.

После этого 3 "хороший" осталось:

bool output = string.Compare("foo", "FOO", StringComparison.CurrentCultureIgnoreCase) == 0; 
bool output = string.Compare("foo", "FOO", true) == 0; 
bool output = "foo".Equals("FOO", StringComparison.CurrentCultureIgnoreCase); 
+0

Это вопрос, основанный на мнениях. Но на мой взгляд: 'string.Equals (" x "," y ", StringComparison.OrdinalIgnoreCase)' –

+0

Source IndexOf не опция? – Prix

+0

Также смотрите [здесь] (http://stackoverflow.com/questions/3121957/how-can-i-do-a-case-insensitive-string-comparison) и [здесь] (http://stackoverflow.com/ вопросы/6371150/сравнение-две строки-игнорирование-case-in-c-sharp) –

ответ

3

Если вы посмотрите на соответствующие справочные материалы

https://referencesource.microsoft.com/#mscorlib/system/string.cs,bda3b2c94b5251ce

public static int Compare(String strA, String strB, bool ignoreCase) 
    { 
     if (ignoreCase) { 
      return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.IgnoreCase); 
     } 
     return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.None); 
    } 

https://referencesource.microsoft.com/#mscorlib/system/string.cs,0be9474bc8e160b6

public static int Compare(String strA, String strB, StringComparison comparisonType) 
    { 
    ... 
     // Agrument validation, reference equality, null test 

     switch (comparisonType) { 
     ... 
      case StringComparison.CurrentCultureIgnoreCase: 
       return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.IgnoreCase); 

https://referencesource.microsoft.com/#mscorlib/system/string.cs,d47c1f57ad1e1e6e

public static bool Equals(String a, String b, StringComparison comparisonType) { 
    ... 
     // Agrument validation, reference equality, null test 

     switch (comparisonType) { 
     ... 
      case StringComparison.CurrentCultureIgnoreCase: 
       return (CultureInfo.CurrentCulture.CompareInfo.Compare(a, b, CompareOptions.None) == 0); 

вы найдете эти три метода является равное друг друга. Что касается других способов, Regex.IsMatch определенно является превышением (все, что вам нужно сделать, это сравнить строки); ToLower() может быть сложнее, когда дело с культурой конкретных букв, см

https://en.wikipedia.org/wiki/Dotted_and_dotless_I

, поэтому лучше дизайн, чтобы объявить намерен четко (= Я хочу, чтобы сравнить строки), а затем маскировать их (и пусть система)

+0

отличный ответ, +1 – Toshi

+2

@Rawling: Nice catch! Я должен был быть более точным при копировании/вклеивании фрагмента кода –

0

я думаю, что это хорошо

bool output = Regex.IsMatch("foo", "FOO", RegexOptions.IgnoreCase); 
+6

Я думаю, что regex - это последнее, что вы должны когда-либо учитывать, это хорошо только тогда, когда все остальное терпит неудачу. Что показывает, что этот вопрос основан на мнениях и, таким образом, вне темы здесь – slawekwin

0

Если вы проверяете равенство, используйте Equals. Использование Compare является equaivalent, скажем, с помощью

if (collection.Count() == 0) 

вместо

if (collection.Any()) 

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

+0

, но 'Compare' также определяет порядок сортировки (-1,0,1), а' Equals' - только проверка правильности равенства? – Toshi

+0

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

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