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 HashSet
mit einem benutzerdefinierten Vergleicher erstellen:
HashSet<string> hs = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
hs.Add("Hello");
Console.WriteLine(hs.Contains("HeLLo"));
Ordinal
statt verwendest InvariantCulture
. In den .NET-Richtlinien wird empfohlen, diese InvariantCulture
in 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 IEqualityComparer
Sie 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, einecontains
effiziente 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.