C# общая производительность поиска HashSet‹T> должна быть O(1), а производительность поиска ObservableCollection‹T> должна быть 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‹T> или ObservableCollection‹T>.
Если я перебираю все элементы вручную и проверяю их, это занимает то же время, ~ 25 мс.
Но я знаю HashCode всех дат, которые находятся в заданном диапазоне. Можно ли получить все элементы с заданными хэш-кодами из моего HashSet‹T>? Я думаю, так будет намного быстрее...
Можно ли ускорить запрос LINQ? Я предполагаю, что он не использует специальные возможности моего HashSet‹T>?
Date
(которое в вашем случае просто оказывается элементом, используемым для генерации хэша). Вы же понимаете, что HashSet не может получить элемент на основе хеша? См. это. Вам действительно нужно использовать другую структуру данных. - person Sam Holder   schedule 18.05.2012