Comment utiliser la méthode HashSet<string>.Contains()
en mode insensible à la casse?
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"));
Vous devez le créer avec le bon IEqualityComparer
:
HashSet<string> hashset = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
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.
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());