2010-04-19 14 views
59

Cómo usar el método HashSet<string>.Contains() en el modo -insensible?Cómo usar el HashSet <string>. Método Contieneins() en el modo de caso -insensible?

+4

Una sidenode: cuando un 'normal' '' HashSet (mayúsculas y minúsculas) se crea, es imposible crear un método 'contains' que sea eficiente. Esto porque los hashes de los elementos se crean cuando se agregan al 'HashSet'. E internamente, el método 'contains' comprueba que los hash sean eficientes. No es posible (eficientemente) convertir una forma de hash existente 'sensible a las mayúsculas y minúsculas' a 'insensible a mayúsculas y minúsculas'. – Julian

Respuesta

100

puede crear el HashSet con un comparador personalizado:

HashSet<string> hs = new HashSet<string>(StringComparer.OrdinalIgnoreCase); 

hs.Add("Hello"); 

Console.WriteLine(hs.Contains("HeLLo")); 
+13

+1 Porque usa 'Ordinal' en lugar de' InvariantCulture'. Las directrices .NET nos aconsejan no utilizar 'InvariantCulture' en la mayoría de los casos (ver: http://msdn.microsoft.com/en-us/library/ms973919.aspx). – Steven

+1

CurrentCultureIgnoreCase es generalmente la mejor opción. –

+3

@HansPassant ¿por qué? – guiomie

9

Es necesario crear con la derecha IEqualityComparer:

HashSet<string> hashset = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase); 
5

Se debe utilizar la constructor que le permite especificar el IEqualityComparer quieres usar

HashSet<String> hashSet = new HashSet<String>(StringComparer.InvariantCultureIgnoreCase); 

El objeto StringComparer proporciona algunos comparador menudo utilizado como propiedades estáticas.

4

No es necesario aquí, como han demostrado otras respuestas, pero en otros casos donde no está utilizando una cadena, puede optar por implementar un IEqualityComparer<T> y luego puede usar una sobrecarga .Contains. Aquí hay un ejemplo con una cadena (una vez más, otras respuestas han demostrado que ya hay un comparador de cadenas que puede usar que satisfaga sus necesidades). Muchos métodos que rodean IEnumerable<T> tienen sobrecargas que aceptan tales comparadores, por lo que es bueno aprender cómo implementarlos.

class CustomStringComparer : IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     return x.Equals(y, StringComparison.InvariantCultureIgnoreCase); 
    } 

    public int GetHashCode(string obj) 
    { 
     return obj.GetHashCode(); 
    } 
} 

y luego usarlo

bool contains = hash.Contains("foo", new CustomStringComparer()); 
Cuestiones relacionadas