Il C# il generico HashSet < T> prestazioni di ricerca dovrebbe essere O (1), e le prestazioni di ricerca di una ObservableCollection < T> dovrebbe essere O (n).C# HashSet <T> prestazioni di ricerca (rispetto a ObservableCollection <T>)?
Ho una grande quantità di elementi unici, ogni elemento ha una proprietà DateTime che non è univoca.
Ogni elemento calcola il proprio HashCode semplicemente restituendo il suo DateTime.GetHashCode().
Ora voglio ottenere un sottoinsieme dei miei dati, ad es. tutti gli elementi che hanno una data che si trova tra marzo 2012 e giugno 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;
Se corro questa query LINQ su una collezione di 300.000 elementi, ci vuole ~ 25 ms per tornare 80 elementi che si trovano all'interno della gamma data - Non importa se utilizzo un HashSet < T> o ObservableCollection < T>.
Se faccio scorrere tutti gli elementi manualmente e li controllo, richiede lo stesso tempo, ~ 25 ms.
Ma conosco il codice hash di tutte le date che rientrano nell'intervallo specificato. È possibile ottenere tutti gli elementi con gli HashCode forniti dal mio HashSet < T>? Penso che sarebbe molto più veloce ...
È possibile velocizzare la query LINQ? Suppongo che non sfrutti le abilità speciali del mio HashSet < T>?
Il codice hash di ogni elemento è la data? – Jodrell
Non ci sono abilità speciali di un HashSet che consentirà il recupero efficiente di elementi la cui data rientra in un intervallo. Un HashSet consente di determinare rapidamente se un determinato oggetto o valore è (o non è) nell'insieme. –
hatchet
La mia prima osservazione è che i codici hash dovrebbero essere diversi, se possibile, se gli oggetti differiscono (questo chiaramente non può essere sempre il caso, ma è ciò che si intende perseguire). Nel tuo caso questo non è il caso. Hai diversi elementi con hashcode identici che è male. Nel peggiore dei casi, se hai solo tre diverse date uniche, il tuo hashset avrà solo tre bucket e quindi trovare qualcosa nell'hashset dovrà ordinare tutti gli elementi in quel bucket che lo portano ad essere O (n) (dare o prendere). Dovrei anche notare che questa è una nota generale, non direttamente correlata alle domande :) – Chris