Wie verwende HashSet<string>.Contains()ich die Methode im Modus ohne Berücksichtigung der Groß- und Kleinschreibung?
Wie verwende HashSet<string>.Contains()ich die Methode im Modus ohne Berücksichtigung der Groß- und Kleinschreibung?
Antworten:
Sie können das HashSetmit einem benutzerdefinierten Vergleicher erstellen:
HashSet<string> hs = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
hs.Add("Hello");
Console.WriteLine(hs.Contains("HeLLo"));
Ordinalstatt verwendest InvariantCulture. In den .NET-Richtlinien wird empfohlen, diese InvariantCulturein den meisten Fällen nicht zu verwenden (siehe: msdn.microsoft.com/en-us/library/ms973919.aspx ).
Dies ist hier nicht erforderlich, wie andere Antworten gezeigt haben. In anderen Fällen, in denen Sie keine Zeichenfolge verwenden, können Sie eine implementieren IEqualityComparer<T>und anschließend eine .ContainsÜberladung verwenden. Hier ist ein Beispiel mit einer Zeichenfolge (andere Antworten haben gezeigt, dass es bereits einen Zeichenfolgenvergleicher gibt, den Sie verwenden können, der Ihren Anforderungen entspricht). Viele Methoden in der Umgebung IEnumerable<T>weisen Überladungen auf, die solche Vergleicher akzeptieren. Daher ist es gut zu lernen, wie man sie implementiert.
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();
}
}
Und dann benutze es
bool contains = hash.Contains("foo", new CustomStringComparer());
Sie sollten den Konstruktor verwenden , mit dem IEqualityComparerSie den gewünschten Konstruktor angeben können .
HashSet<String> hashSet = new HashSet<String>(StringComparer.InvariantCultureIgnoreCase);
Das StringComparer- Objekt bietet einige häufig verwendete Vergleiche als statische Eigenschaften.
HashSet<string>(Groß- und Kleinschreibung beachten ) erstellt wird, ist es unmöglich, einecontainseffiziente Methode zu erstellen . Dies liegt daran, dass die Hashes der Elemente erstellt werden, wenn sie dem hinzugefügt werdenHashSet. Und interncontainsüberprüft die Methode die Hashes, um effizient zu sein. Es ist nicht möglich, eine vorhandene Hash-Form (Groß- und Kleinschreibung beachten) (effizient) in "Groß- und Kleinschreibung beachten" umzuwandeln.