HashSet Die C # HashSet-Datenstruktur wurde in .NET Framework 3.5 eingeführt. Eine vollständige Liste der implementierten Mitglieder finden Sie auf der HashSet MSDN- Seite.
- Wo wird es verwendet?
- Warum sollten Sie es verwenden wollen?
HashSet Die C # HashSet-Datenstruktur wurde in .NET Framework 3.5 eingeführt. Eine vollständige Liste der implementierten Mitglieder finden Sie auf der HashSet MSDN- Seite.
Antworten:
A HashSet
enthält eine Reihe von Objekten, aber auf eine Weise, mit der Sie einfach und schnell feststellen können, ob sich ein Objekt bereits in der Menge befindet oder nicht. Dazu wird ein Array intern verwaltet und das Objekt mithilfe eines Index gespeichert, der aus dem Hashcode des Objekts berechnet wird. Schauen Sie hier
HashSet
ist eine ungeordnete Sammlung mit einzigartigen Elementen. Es verfügt über die Standard-Erfassungsoperationen Hinzufügen, Entfernen, Enthält. Da jedoch eine Hash-basierte Implementierung verwendet wird, sind diese Operationen O (1). (Im Gegensatz zu List zum Beispiel O (n) für Enthält und Entfernen.) HashSet
Bietet auch Standardsatzoperationen wie Vereinigung , Schnittpunkt und symmetrische Differenz . Schauen Sie hier
Es gibt verschiedene Implementierungen von Sets. Einige machen Einfüge- und Suchvorgänge durch Hashing-Elemente sehr schnell. Dies bedeutet jedoch, dass die Reihenfolge, in der die Elemente hinzugefügt wurden, verloren geht. Bei anderen Implementierungen bleibt die hinzugefügte Reihenfolge auf Kosten langsamerer Laufzeiten erhalten.
Die HashSet
Klasse in C # geht für den ersten Ansatz, wobei die Reihenfolge der Elemente nicht beibehalten wird. Es ist viel schneller als ein normaler List
. Einige grundlegende Benchmarks haben gezeigt, dass HashSet im Umgang mit Primärtypen (int, double, bool usw.) deutlich schneller ist. Es ist viel schneller, wenn Sie mit Klassenobjekten arbeiten. Der Punkt ist also, dass HashSet schnell ist.
Der einzige Haken dabei HashSet
ist, dass es keinen Zugriff durch Indizes gibt. Um auf Elemente zuzugreifen, können Sie entweder einen Enumerator verwenden oder die integrierte Funktion verwenden, um das HashSet
in ein zu konvertieren List
und dieses zu durchlaufen. Schauen Sie hier
A HashSet
hat eine interne Struktur (Hash), in der Elemente schnell gesucht und identifiziert werden können. Der Nachteil ist, dass durch a iteriertHashSet
(oder das Abrufen eines Elements nach Index) ziemlich langsam ist.
Warum sollte jemand wissen wollen, ob ein Eintrag bereits in einem Set vorhanden ist?
Eine Situation, in der a HashSet
nützlich ist, besteht darin, eindeutige Werte aus einer Liste abzurufen, in der möglicherweise Duplikate vorhanden sind. Sobald ein Artikel zum hinzugefügt wurde, HashSet
kann schnell festgestellt werden, ob der Artikel vorhanden ist ( Contains
Operator).
Weitere Vorteile der HashSet
sind die Set - Vorgänge: IntersectWith
, IsSubsetOf
, IsSupersetOf
, Overlaps
, SymmetricExceptWith
, UnionWith
.
Wenn Sie mit der Sprache der Objektbeschränkungen vertraut sind, identifizieren Sie diese festgelegten Operationen. Sie werden auch sehen, dass es einer Implementierung von ausführbarer UML einen Schritt näher kommt.
Einfach gesagt und ohne die Geheimnisse der Küche preiszugeben:
Ein Set im Allgemeinen ist eine Sammlung, die keine doppelten Elemente enthält und deren Elemente in keiner bestimmten Reihenfolge sind. A HashSet<T>
ähnelt also einem Generikum List<T>
, ist jedoch für schnelle Suchvorgänge (über Hashtabellen, wie der Name schon sagt) auf Kosten des Auftragsverlusts optimiert.
Wenn Sie aus Anwendungssicht nur Duplikate vermeiden müssen, ist dies genau das, HashSet
wonach Sie suchen, da die Komplexität beim Nachschlagen, Einfügen und Entfernen O (1) - konstant ist . Was dies bedeutet, dass es keine Rolle spielt, wie viele Elemente es HashSet
hat, wird die gleiche Zeit in Anspruch nehmen, um zu prüfen, ob es ein solches Element gibt oder nicht. Da Sie auch Elemente bei O (1) einfügen, ist es perfekt für diese Art von Dingen.