Ich versuche, eine Liste der zwischengespeicherten Pfade auf einem A * -Algorithmus zu implementieren. Derzeit werden die im Cache gespeicherten Pfade in einer Liste wie folgt gespeichert:Warum sollte ich ein HashSet über ein Dictionary verwenden?
readonly List<CachedPath> _cachedPaths = new List<CachedPath>();
Die Operationen über diese Liste durchgeführt werden:
FirstOrDefault ein Element zu erhalten, die bestimmten Bedingungen
var cached = _cachedPaths.FirstOrDefault(p => p.From == from && p.To == target && p.Actor == self);
erfüllt entfernen und Element
_cachedPaths.Remove(cached);
Ergänzungen
_cachedPaths.Add(new CachedPath {
From = from,
To = target,
Actor = self,
Result = pb,
Tick = _world.WorldTick
});
HINWEIS: Die Klasse CachedPath hat GetHashCode und Equals nur durch die von, nach und Schauspieler außer Kraft gesetzt, so dass zwei Instanzen, die diese Attribute haben den gleichen Hash und Gleichheit haben.
Da schnelle Lookups (enthält), Einfügungen und Löschungen in einem ‚HashSet‘ sind O (1) (wenn ich mich nicht irre), hielt ich mit einem ‚HashSet‘ diese Operationen zu tun. Das einzige Problem ist der FirstOrDefault, den ich die ganze Sammlung aufzählen musste, um es zu bekommen.
dieses Problem Da ich als auch durch den Hash von, nach und Schauspieler indiziert eine Dictionary:
Dictionary<int, CachedPath> cachedPath
Noch einmal, wenn ich mich nicht irre, Wörterbuch bietet auch O (1) in Einfügungen, Löschungen und auch das Abrufen durch Key. Das führt mich zu der Annahme, dass ein Dictionary eine HashSet + O (1) -Element-Retrieval-Funktion ist.
Fehle ich etwas? Ist das Wörterbuch wirklich besser als HashSet in dem Sinne, dass es mehr Operationen unterstützt?
Vielen Dank im Voraus.
http://stackoverflow.com/questions/2728500/hashsett-versus-dictionaryk-vwrt-searching-time-to-find-if-an-item-exist –