Как я могу сделать Array.Contains без учета регистра для строкового массива?


172

Я использую Array.Containsметод на строковом массиве. Как я могу сделать это без учета регистра?

Ответы:


307
array.Contains("str", StringComparer.OrdinalIgnoreCase);

Или, в зависимости от конкретных обстоятельств, вы можете предпочесть:

array.Contains("str", StringComparer.CurrentCultureIgnoreCase);
array.Contains("str", StringComparer.InvariantCultureIgnoreCase);

4
Согласно msdn.microsoft.com/en-us/library/dd465121.aspx , «инвариантная культура имеет очень мало свойств, которые делают ее полезной для сравнения». Почти во всех случаях, когда вам не нужно сравнение с учетом конкретной культуры ( CurrentCulture), вы должны использовать Ordinalвместо InvariantCulture.
bdukes

2
@bdukes Это слишком сильное утверждение. Есть веские причины для использования InvariantCulture. Использование любого из трех вариантов выбора выше зависит от обстоятельств. Я не возражаю против вашего изменения порядка, но я удаляю комментарий «вероятно, нет». В ответе уже ясно, что вы должны выбрать тот, который подходит вам в текущей ситуации.
Мехрдад Афшари

1
Мне потребовалось время, чтобы понять, что Contains - это метод расширения в System.Linq.
Крейг Селесте

LINQ, чтобы сохранить день снова.
Брайанти

@MehrdadAfshari В этом случае предыдущий комментарий совершенно корректен. «Содержит» нужно только проверить равенство, что более эффективно при обычном сравнении. Другие сравнения, основанные на «культуре», касаются упорядочения символов и, следовательно, имеют отношение только к сортировке.
user1751825

9

Несколько важных замечаний с моей стороны, или, по крайней мере, размещение некоторой распределенной информации в одном месте - относительно приведенного выше совета с помощью StringComparer, например:

if (array.Contains("str", StringComparer.OrdinalIgnoreCase))
{}
  1. array.Contains() является методом расширения LINQ и поэтому работает по стандарту только с .NET 3.5 или выше, для чего требуется:
    using System;
    using System.Linq;

  2. Но: в .NET 2.0 простой Contains()метод (без учета нечувствительности к регистру) по крайней мере возможен, например, с приведением:

    if ( ((IList<string>)mydotNet2Array).Contains(“str”) ) {}

    Поскольку метод Contains () является частью интерфейса IList, он работает не только с массивами, но также со списками и т. Д.


1

Реализуйте пользовательский IEqualityComparer, который учитывает регистронезависимость.

Кроме того, проверьте это . Так что (в теории) все, что вам нужно сделать, это:

myArray.Contains("abc", ProjectionEqualityComparer<string>.Create(a => a.ToLower()))

18
Потому что до 5 минут назад я не знал, что существует StringComparer. :)
Kon

0
new[] { "ABC" }.Select(e => e.ToLower()).Contains("abc") // returns true

4
Но не приведет ли это к дорогостоящему вызову ToLower () для каждого элемента в списке? String.Equals с перегрузкой StringComparison будет лучше подходить в этом примере.
Майк Коул
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.