El C# el HashSet genérico < El rendimiento de búsqueda T> debe ser O (1), y el rendimiento de búsqueda de un ObservableCollection < T> debe ser O (n).C# HashSet <T> rendimiento de búsqueda (en comparación con un ObservableCollection <T>)?
Tengo una gran cantidad de elementos únicos, cada elemento tiene una propiedad DateTime que no es única.
Cada elemento calcula su HashCode simplemente devolviendo su DateTime.GetHashCode().
Ahora quiero obtener un subconjunto de mis datos, p. todos los elementos que tienen una fecha que es entre marzo de 2012 y junio de 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;
Si me quedo esta consulta LINQ en una colección de 300.000 elementos, se tarda unos 25 ms para volver 80 elementos que se encuentran dentro del rango dado - No importa si uso un HashSet < T> o un ObservableCollection < T>.
Si recorro todos los elementos manualmente y los reviso, tarda el mismo tiempo, ~ 25 ms.
Pero conozco el HashCode de todas las fechas que están dentro del rango dado. ¿Es posible obtener todos los elementos con los HashCodes dados desde mi HashSet < T>? Creo que eso sería mucho más rápido ...
¿Es posible acelerar la consulta LINQ? Supongo que no hace uso de las habilidades especiales de mi HashSet < T>?
¿El código hash de cada elemento es su fecha? – Jodrell
No hay capacidades especiales de un HashSet que permitan la recuperación eficiente de elementos cuya fecha se encuentre dentro de un rango. Un HashSet permite una determinación rápida de si un objeto o valor en particular es (o no) en el conjunto. –
hatchet
Mi primera observación es que los códigos hash deben ser diferentes siempre que sea posible si los objetos difieren (esto no siempre puede ser el caso, pero es a lo que se debe apuntar). En tu caso, este no es el caso. Tienes diferentes elementos con hashcodes idénticos que son malos. En el peor de los casos, si solo tienes tres fechas únicas diferentes, tu hashset tendrá solo tres cubos y, por lo tanto, al buscar algo en el hashset tendrás que ordenar todos los elementos del mismo, lo que lo convertirá en O (n) (dar o recibir) También debería tener en cuenta que esta es una nota general, no directamente relacionada con la pregunta :) – Chris