Verwenden von DictionaryFoo, Foo anstelle von ListFoo, um Aufrufe von Contains () zu beschleunigen

7

Ich habe eine Frage zu generischen Sammlungen in C #. Wenn ich eine Objektgruppe speichern muss und häufig prüfen muss, ob sich ein Objekt in der Sammlung befindet, wäre es schneller, das Wörterbuch anstelle von Liste zu verwenden?

Ich habe gehört, dass die Überprüfung, ob ein Element in der Sammlung ist, relativ zur Größe von Listen und relativ zur Größe von Wörterbüchern linear ist. Verwendet das Dictionary und setzt dann für jedes Schlüssel / Wert-Paar Schlüssel und Wert auf dasselbe Objekt, was andere Programmierer in dieser Situation häufig tun?

Danke, dass Sie sich die Zeit genommen haben, dies zu lesen.

    
Newell Clark 15.05.2012, 20:44
quelle

6 Antworten

5

Ja, ja, ist es. Das heißt, wahrscheinlich möchten Sie HashSet verwenden, da Sie weder einen Schlüssel noch einen Wert benötigen, sondern nur eine Menge von Elementen.

Es ist auch erwähnenswert, dass Dictionary in C # 2.0 hinzugefügt wurde und HashSet in 3.5 hinzugefügt wurde, also war es eigentlich immer üblich, ein Dictionary zu verwenden, wenn Sie ein Set wollten, nur weil es das war alles was du hattest (ohne dein eigenes zu rollen). Als ich gezwungen wurde, dies zu tun, steckte ich einfach Null in den Wert, anstatt das Element als Schlüssel und Wert, aber die Idee ist die gleiche.

    
Servy 15.05.2012, 20:46
quelle
5

Verwenden Sie einfach HashSet<Foo> , wenn es sich um schnelle Containment-Tests handelt.

A Dictionary<TKey, TValue> dient zum Suchen nach einem Wert basierend auf einem Schlüssel.

A List<T> ist für den direkten Zugriff und dynamische Wachstumseigenschaften.

A HashSet<T> dient zum Modellieren eines Sets und zum Bereitstellen von schnellen Containment-Tests.

Sie suchen nicht nach einem Wert, der auf einem Schlüssel basiert. Sie sind nicht besorgt über den wahlfreien Zugriff, sondern eher schnelle Eindämmungskontrollen. Das richtige Konzept ist hier ein HashSet<T> .

    
jason 15.05.2012 20:46
quelle
5

Unter der Annahme, dass nur eine Kopie des Elements in der Liste vorhanden ist, lautet die entsprechende Datenstruktur ISet<T> , speziell HashSet<T> .

Das heißt, ich habe das Timing gesehen, das anzeigt, dass ein Dictionary<TKey, TValue> ContainsKey Aufruf ein kleines bisschen schneller ist als sogar HashSet<T> . In beiden Fällen werden beide schneller geladen als eine einfache List<T> Suche.

Beachten Sie, dass diese beiden Methoden (HashSet und Dictionary) auf relativ gut implementierten Equals und GetHashcode Implementierungen für T basieren. List<T> beruht nur auf Equals

    
Chris Shain 15.05.2012 20:46
quelle
3

Ein Dictionary oder HashSet verwendet mehr Speicher, bietet aber (fast) O (1) Suchzeit.

    
Dave Bish 15.05.2012 20:46
quelle
2

Vielleicht möchten Sie sich HashSet anschauen, das eine Sammlung einzigartiger Objekte (z solange das Objekt IEquality comparer implementiert).

    
saluce 15.05.2012 20:47
quelle
1

Sie erwähnen die Verwendung von List<T> , was bedeutet, dass die Reihenfolge wichtig sein kann. Wenn dies der Fall ist, sollten Sie auch in den SortedSet<T> -Typ schauen.

    
Andrew Hanlon 17.05.2012 14:11
quelle

Tags und Links