C# das generische HashSet < T> Suchleistung sollte O (1), und die Suchleistung einer ObservableCollection < T> sollte O (n) sein wird.C# HashSet <T> Suchleistung (im Vergleich zu einer ObservableCollection <T>)?
ich eine große Menge an einzigartigen Elementen haben, hat jedes Element eine Datetime-Eigenschaft, die nicht eindeutig ist.
Jedes Element berechnet seine HashCode einfach durch seine Rückkehr DateTime.GetHashCode().
Jetzt möchte ich eine Teilmenge meiner Daten, z. alle Elemente, die ein Datum haben, die zwischen März 2012 und Juni 2012
var result = from p in this.Elements
where p.Date >= new DateTime(2012, 03, 01) &&
p.Date <= new DateTime(2012, 30, 06
select p;
Wenn ich ausführen, um diese LINQ-Abfrage auf einer Sammlung von 300.000 Elementen ist, dauert es ca. 25 ms 80 Elemente zurück, die innerhalb des angegebenen Bereichs sind - Es spielt keine Rolle, ob ich ein HashSet < T> oder eine ObservableCollection < T> verwende.
Wenn ich Schleife durch alle Elemente manuell und überprüfen sie, es die gleiche Zeit in Anspruch nimmt, ~ 25 ms.
Aber ich tun, um die HashCode aller Daten kennen, die innerhalb des angegebenen Bereichs liegen. Ist es möglich, alle Elemente mit den gegebenen HashCodes von meinem HashSet < T> zu bekommen? Ich denke, das wäre viel schneller ...
Ist es möglich, die LINQ-Abfrage zu beschleunigen? Ich nehme an, dass es die speziellen Fähigkeiten meines HashSet < T> nicht nutzt?
Ist der Hashcode jedes Elements sein Datum? – Jodrell
Es gibt keine speziellen Fähigkeiten eines HashSet, die einen effizienten Abruf von Elementen ermöglichen, deren Datum in einen Bereich fällt. Ein HashSet erlaubt eine schnelle Bestimmung, ob ein bestimmtes Objekt oder ein bestimmter Wert in der Menge ist oder nicht. –
hatchet
Meine erste Beobachtung ist, dass Hash-Codes wenn möglich anders sein sollten, wenn die Objekte sich unterscheiden (dies kann nicht immer der Fall sein, aber es ist das, was Sie anstreben sollten). In Ihrem Fall ist dies nicht der Fall. Sie haben verschiedene Elemente mit identischen Hashcodes, was schlecht ist. Im schlimmsten Fall, wenn Sie nur drei verschiedene eindeutige Daten hatten, wird Ihr Hashset nur drei Buckets haben. Wenn Sie also etwas im Hashset finden, müssen Sie alle Elemente in diesem Bucket sortieren, um O (n) zu erhalten). Auch sollte ich beachten, dass dies eine allgemeine Anmerkung ist, nicht direkt auf die Fragen bezogen :) – Chris