Como posso fazer Array.Contains sem distinção entre maiúsculas e minúsculas em uma matriz de strings?


172

Eu estou usando o Array.Containsmétodo em uma matriz de seqüência de caracteres. Como posso fazer isso sem distinção entre maiúsculas e minúsculas?

Respostas:


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

Ou, dependendo da circunstância específica, você pode preferir:

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

4
De acordo com msdn.microsoft.com/en-us/library/dd465121.aspx , "a cultura invariável possui muito poucas propriedades que a tornam útil para comparação". Em quase todos os casos em que você não deseja uma comparação específica de cultura ( CurrentCulture), você deve usar em Ordinalvez de InvariantCulture.
Bdukes

2
@bdukes Isso é muito forte de uma declaração. Existem razões válidas para usar InvariantCulture. O uso de qualquer uma das três opções acima depende da circunstância. Não sou contra sua reordenação, mas estou removendo o comentário "provavelmente não". Já ficou claro na resposta que você deve escolher aquele que funciona para você na situação atual.
Mehrdad Afshari

1
Levei um momento para perceber que Contains é um método de extensão no System.Linq.
Craig Celeste

LINQ para salvar o dia novamente.
Bryantee

@MehrdadAfshari Nesse caso, o comentário anterior é perfeitamente válido. "Contém" precisa apenas verificar a igualdade, o que é mais eficiente com a comparação Ordinal. As outras comparações conscientes da "Cultura" preocupam-se com a ordem dos caracteres e, portanto, são relevantes apenas para a classificação.
user1751825 20/02

9

Algumas notas importantes do meu lado, ou pelo menos colocar algumas informações distribuídas em um só lugar - sobre a dica acima com um StringComparer como em:

if (array.Contains("str", StringComparer.OrdinalIgnoreCase))
{}
  1. array.Contains() é um método de extensão LINQ e, portanto, funciona por padrão somente no .NET 3.5 ou superior, precisando:
    using System;
    using System.Linq;

  2. Mas: no .NET 2.0, o Contains()método simples (sem levar em consideração a insensibilidade do caso) é pelo menos possível assim, com uma conversão:

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

    Como o método Contains () faz parte da interface IList, isso funciona não apenas com matrizes, mas também com listas, etc.


1

Implementar um IEqualityComparer personalizado que leve em consideração a distinção entre maiúsculas e minúsculas.

Além disso, verifique isso . Então (em teoria) tudo o que você precisa fazer é:

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

18
Porque até 5 minutos atrás eu não sabia que um StringComparer existia. :)
Kon

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

4
Mas isso não faria uma chamada ToLower () cara em cada item da lista? String.Equals com a sobrecarga StringComparison seria mais adequado neste exemplo.
Mike Cole
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.