如果您只有静态数据,那么任何实现 IList 的结构都应该没问题。对其进行一次排序,然后使用 BinarySearch 进行查询。如果您插入的时间戳总是在增加,这也应该有效,那么您可以在 O(1) 中执行 List.Add() 并且它仍然会被排序。
List<int> x = new List<int>();
x.Add(5);
x.Add(7);
x.Add(3);
x.Sort();
//want to find all elements between 4 and 6
int rangeStart = x.BinarySearch(4);
//since there is no element equal to 4, we'll get the binary complement of an index, where 4 could have possibly been found
//see MSDN for List<T>.BinarySearch
if (rangeStart < 0)
rangeStart = ~rangeStart;
while (x[rangeStart] < 6)
{
//do you business
rangeStart++;
}
如果您需要在结构中的随机点插入数据、保持排序并能够快速查询范围,则需要一个名为B+ 树的结构。它没有在框架中实现,您需要自己在某个地方获取它。
在最坏的情况下插入记录需要 O(log n) 操作
在最坏的情况下,查找记录需要 O(log n) 次操作
在最坏的情况下,删除(先前定位的)记录需要 O(log n) 操作
在最坏的情况下,执行范围内出现 k 个元素的范围查询需要 O((log n) + k) 次操作。
PS “是否有一些不错的 linq 查询可以在一行中完成我想要的所有事情”
我希望我知道这么好的 linq 查询可以在一行中完成我想要的一切:-)