¿Cómo puedo hacer Array.Contains sin distinción entre mayúsculas y minúsculas en una matriz de cadenas?

172

Estoy usando el Array.Containsmétodo en una matriz de cadenas. ¿Cómo puedo hacer que no distinga entre mayúsculas y minúsculas?

Mike Cole
fuente

Respuestas:

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

O dependiendo de la circunstancia específica, puede preferir:

array.Contains("str", StringComparer.CurrentCultureIgnoreCase);
array.Contains("str", StringComparer.InvariantCultureIgnoreCase);
Mehrdad Afshari
fuente
44
Según msdn.microsoft.com/en-us/library/dd465121.aspx , "la cultura invariante tiene muy pocas propiedades que la hagan útil para la comparación". En casi todos los casos en los que no desea una comparación específica de la cultura ( CurrentCulture), debería usarla en Ordinallugar de hacerlo InvariantCulture.
bdukes
2
@bdukes Esa es una declaración demasiado fuerte. Hay razones válidas para usar InvariantCulture. El uso de cualquiera de las tres opciones anteriores depende de las circunstancias. No me opongo a su reordenamiento, pero estoy eliminando el comentario "probablemente no". Ya está claro en la respuesta que debe elegir el que funcione para usted en la situación actual.
Mehrdad Afshari
1
Me tomó un momento darme cuenta de que Contains es un método de extensión en System.Linq.
Craig Celeste
LINQ para salvar el día nuevamente.
Bryantee
@MehrdadAfshari En este caso, el comentario anterior es perfectamente válido. "Contiene" solo necesita verificar la igualdad, que es más eficiente con la comparación ordinal. Las otras comparaciones conscientes de "Cultura" se refieren al orden de los caracteres y, por lo tanto, solo son relevantes para la clasificación.
usuario1751825
9

Algunas notas importantes de mi parte, o al menos poner información distribuida en un lugar, con respecto al consejo anterior con un StringComparer como en:

if (array.Contains("str", StringComparer.OrdinalIgnoreCase))
{}
  1. array.Contains() es un método de extensión LINQ y, por lo tanto, funciona de manera estándar solo con .NET 3.5 o superior, y necesita:
    using System;
    using System.Linq;

  2. Pero: en .NET 2.0, el Contains()método simple (sin tener en cuenta la insensibilidad a mayúsculas y minúsculas) es al menos posible de esta manera, con un reparto:

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

    Como el método Contains () es parte de la interfaz IList, esto funciona no solo con matrices, sino también con listas, etc.

Philm
fuente
1

Implemente un IEqualityComparer personalizado que tenga en cuenta las mayúsculas y minúsculas.

Además, mira esto . Entonces (en teoría) todo lo que tendrías que hacer es:

myArray.Contains("abc", ProjectionEqualityComparer<string>.Create(a => a.ToLower()))
Kon
fuente
18
Porque hasta hace 5 minutos no sabía que existía un StringComparer. :)
Kon
0
new[] { "ABC" }.Select(e => e.ToLower()).Contains("abc") // returns true
Darin Dimitrov
fuente
44
¿Pero no realizaría esto una costosa llamada a ToLower () en cada elemento de la lista? String.Equals con la sobrecarga StringComparison sería más adecuado en este ejemplo.
Mike Cole