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

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

Ответ 1

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

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

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

Ответ 2

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

if (array.Contains("str", StringComparer.OrdinalIgnoreCase))
{}
  • array.Contains() - это метод расширения LINQ и поэтому работает по стандарту только с .NET 3.5 или выше.

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

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

  • Дополнение 1: По причине, приведенной выше, StringComparer в 1. работает только со следующими включениями пространства имен (протестировано с .NET 3.5):

    using System;

    using System.Linq;

  • Дополнение к 2.: Метод Contains() работает не только с массивами, но и со списками: -)

Ответ 3

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

Ответ 4

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

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

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