C# ogólna HashSet < T> wydajność wyszukiwania powinna wynosić O (1), a wydajność wyszukiwania ObservableCollection < T> powinna wynosić O (n).C# HashSet <T> wydajność wyszukiwania (w porównaniu do ObservableCollection <T>)?
Mam dużą liczbę unikalnych elementów, każdy element ma właściwość DateTime, która nie jest unikalna.
Każdy element oblicza swój HashCode, po prostu zwracając jego DateTime.GetHashCode().
Teraz chcę uzyskać podzbiór moich danych, np. Wszystkie elementy, które mają datę, która jest w okresie od marca 2012 do czerwca 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;
Jeżeli uruchomić kwerendy LINQ na kolekcję 300.000 elementów, trwa ~ 25 ms powrót 80 elementów, które są w danym przedziale - Nie ma znaczenia, czy używam HashSet < T> czy ObservableCollection < T>.
Jeśli przejdę wszystkie elementy ręcznie i sprawdzę je, zajmuje to samo, ~ 25 ms.
Ale znam HashCode wszystkich dat, które są w podanym zakresie. Czy można uzyskać wszystkie elementy o podanych HashCodes z mojego HashSet < T>? Myślę, że byłoby znacznie szybciej ...
Czy można przyspieszyć zapytanie LINQ? Zakładam, że nie korzysta ze specjalnych zdolności mojego HashSet < T>?
Czy hashcode każdego elementu jest datą? – Jodrell
Nie ma specjalnych możliwości programu HashSet, który umożliwi wydajne pobieranie elementów, których data mieści się w zakresie. A HashSet pozwala na szybkie określenie, czy dany obiekt lub wartość jest (lub nie jest) w zbiorze. –
hatchet
Moja pierwsza uwaga jest taka, że kody skrótu powinny być różne tam, gdzie to możliwe, jeśli obiekty są różne (to oczywiście nie zawsze może tak być, ale jest to cel, do którego dążysz). W twoim przypadku tak nie jest. Masz różne elementy z identycznymi hashcode, które są złe. W najgorszym przypadku, gdybyś miał tylko trzy różne unikalne daty, twój hashset będzie miał tylko trzy wiaderka, a więc znalezienie czegoś w haszymdzie będzie musiało posortować wszystkie elementy w tym wiadrze, prowadząc je do O (n) (daj lub weź)). Powinienem również zauważyć, że jest to ogólna uwaga, która nie jest bezpośrednio związana z pytaniami :) – Chris