通过DateTime搜索最快的集合方法

时间:2010-12-14 12:00:23

标签: c# collections

我有一个包含10个键的词典,每个键都有一个包含最多30,000个值的列表。值包含DateTime属性。

我经常需要提取其中一个键的一小部分,例如30到60秒的日期范围。

这样做很容易,但让它快速运行并非如此。查询此内存数据的最有效方法是什么?

非常感谢。

4 个答案:

答案 0 :(得分:2)

1)保留字典,但使用SortedList代替字典值列表,按DateTime属性排序

2)实现二进制搜索,找到排序列表中范围内的上边和下边,为您提供索引。

3)只需使用Sortedlist.Values.Skip(lowerIndex).Take(upperIndex - lowerIndex)

选择范围内的值即可

答案 1 :(得分:2)

首先按日期对列表进行排序,然后通过二分查找(即k项)找到所需项目并返回它们,找到搜索项目为O(log(n)),因为您需要找到第一个和最后一个索引。返回它们是所有It的O(K + log(n))

中的O(K)
    IEnumerable<item> GetItems(int startIndex, int endIndex, List<item> input)
    {
        for (int i=startIndex;i<endIndex;i++)
           yield return input[i];
    }

答案 2 :(得分:0)

最快的方法是组织数据,使其被您要搜索的内容编入索引。目前您已按密钥编制索引,但您希望按日期搜索。我认为你最好按日期索引它,如果那是你想要搜索的内容。

我会保留2个词典,一个像现在一样编入索引,一个用日期索引项目。我将决定一个时间范围(比如1分钟),并根据发生的时间将每个对象添加到列表中,然后在该分钟的键下将每个列表添加到字典中。然后,当您需要特定时间范围的数据时,生成相关的分钟并从字典中获取列表。这依赖于您能够从对象中知道另一个字典中的键。

答案 3 :(得分:0)

回复Aliostad:如果集合列表是链表,我认为bsearch不会起作用。它仍然需要O(n)