Производительность поиска C# HashSet (по сравнению с ObservableCollection)?

В C# общая производительность поиска HashSet должна быть O(1), а производительность поиска ObservableCollection должна быть O(n) .

У меня есть большое количество уникальных элементов, каждый элемент имеет свойство DateTime, которое не является уникальным.

Каждый элемент вычисляет свой HashCode, просто возвращая свой DateTime.GetHashCode().

Теперь я хочу получить подмножество своих данных, например. все элементы, имеющие дату между мартом 2012 г. и июнем 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;

Если я запускаю этот запрос LINQ для набора из 300 000 элементов, требуется ~25 мс, чтобы вернуть 80 элементов, которые находятся в заданном диапазоне — это не имеет значение, использую ли я HashSet или ObservableCollection.

Если я перебираю все элементы вручную и проверяю их, это занимает одинаковое время, ~25 мс.

Но я знаю HashCode всех дат, которые находятся в заданном диапазоне. Можно ли получить все элементы с заданными хэш-кодами из моего HashSet? Думаю, так будет гораздо быстрее...

Можно ли ускорить запрос LINQ? Я предполагаю, что он не использует специальные возможности моего HashSet?

6
задан Ehssan 17 May 2012 в 16:41
поделиться