performance - C# HashSet<T> 搜索性能(与 ObservableCollection<T> 相比)?

标签 performance linq observablecollection hashset

C# 泛型 HashSet 的搜索性能应该是 O(1),而 ObservableCollection 的搜索性能应该是 O(n)。

我有大量的唯一元素,每个元素都有一个不唯一的 DateTime 属性。

每个元素通过简单地返回其 DateTime.GetHashCode() 来计算其 HashCode。

现在我想获取我的数据的一个子集,例如日期介于 2012 年 3 月和 2012 年 6 月之间的所有元素。

    var result = from p in this.Elements
                 where p.Date >= new DateTime(2012, 03, 01) &&
                       p.Date <= new DateTime(2012, 30, 06
                 select p;

如果我在 300.000 个元素的集合上运行此 LINQ 查询,则需要大约 25 毫秒才能返回给定范围内的 80 个元素 - 使用 HashSet 或 ObservableCollection 都没有关系。

如果我手动遍历所有元素并检查它们,则需要相同的时间,约 25 毫秒。

但我确实知道给定范围内的所有日期的 HashCode。是否可以从我的 HashSet 中获取具有给定 HashCode 的所有元素?我认为那会快得多......

是否可以加速 LINQ 查询?我认为它没有利用我的 HashSet 的特殊能力?

最佳答案

您没有使用正确的数据结构。您应该使用类似排序列表(在 Date 属性上排序)之类的东西,然后您可以在其中对范围的开头和结尾进行二分搜索。

关于performance - C# HashSet<T> 搜索性能(与 ObservableCollection<T> 相比)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10639856/

相关文章:

performance - 为什么在 Hive 中 count(distinct) 比 group by 慢?

php - 执行此子查询的更好方法

c# - 将 XML 解析为对象

c# - 使用函数作为 Action 参数

vb.net - 在 VB.Net 中序列化 ObservableCollection(of T)

c++ - 在 Windows 上用 C++ 计算 CPU 时间

mysql - 如何优化缓慢的 MySQL 表更新查询?

c# - Lambda表达式通过导航属性获取数据,LINQToEntities

c# - 哪个 LINQ 表达式更好?

c# - 使用 WPF 的 Entity Framework 存储库模式