web-dev-qa-db-fra.com

Comment utiliser la méthode HashSet <string> .Contains () en mode insensible à la casse?

Comment utiliser la méthode HashSet<string>.Contains() en mode insensible à la casse?

67
Tasawer Khan

Vous pouvez créer le HashSet avec un comparateur personnalisé:

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

hs.Add("Hello");

Console.WriteLine(hs.Contains("HeLLo"));
112
João Angelo

Vous devez le créer avec le bon IEqualityComparer:

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

Vous devez utiliser le constructeur qui vous permet de spécifier le IEqualityComparer que vous souhaitez utiliser.

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

L'objet StringComparer fournit un comparateur souvent utilisé comme propriétés statiques.

5
Thibault Falise

Ce n'est pas nécessaire ici, comme d'autres réponses l'ont démontré, mais dans d'autres cas où vous n'utilisez pas de chaîne, vous pouvez choisir d'implémenter un IEqualityComparer<T> puis vous pouvez utiliser un .Contains surcharge. Voici un exemple utilisant une chaîne (encore une fois, d'autres réponses ont montré qu'il existe déjà un comparateur de chaînes que vous pouvez utiliser et qui répond à vos besoins). De nombreuses méthodes entourant IEnumerable<T> ont des surcharges qui acceptent de tels comparateurs, il est donc bon d'apprendre à les implémenter.

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();
    }
}

Et puis utilisez-le

bool contains = hash.Contains("foo", new CustomStringComparer());
5
Anthony Pegram