2009-06-04 15 views

Respuesta

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

o dependiendo de la circunstancia específica, puede que prefiera:

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

Según http://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 cultura ('CurrentCulture'), debe usar' Ordinal' en lugar de 'InvariantCulture'. – bdukes

+1

@bdukes Eso es una afirmació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 eliminaré el comentario "probablemente no". Ya está claro en la respuesta que debes elegir el que te funcione en la situación actual. –

+0

Me tomó un momento darme cuenta de que Contiene es un método de extensión en System.Linq. –

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

Pero ¿no sería esto realizar una llamada ToLower costosa() en cada elemento en la lista? String.Equals con la sobrecarga de StringComparison sería más adecuado en este ejemplo. –

1

Implementar una costumbre IEqualityComparer que toma casos y la insensibilidad en cuenta.

Además, marque this fuera. De manera que (en teoría) todo lo que tendría que hacer es:

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

¿Por qué reinventar la rueda? –

+12

Porque hasta hace 5 minutos no sabía que existía un StringComparer. :) – Kon

7

Algunas notas importantes de mi lado, o al menos poner algo de información distribuida en un lugar- en relación con la punta de arriba con una 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.

  2. Pero: en .NET 2.0 el método simple de Contains() (sin tomar caso insensibilidad en cuenta) es al menos posible de esta manera, con un reparto:

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

  3. Adición a 1 .: Para la razón dada anteriormente, los StringComparer en 1. sólo funciona con las siguientes inclusiones de espacio de nombres (probado con .NET 3.5):

    using System;

    using System.Linq;

  4. Además de 2 .: El método Contains() no sólo funcionan con matrices, sino que también funciona con listas :-)

Cuestiones relacionadas