我有一个简单的类:
public class MyClass{
public long StartRange { get; set; }
public long EndRange { get; set; }
public int Id { get; set; }
}
我需要将大量的这些内容(10^5到10^6)存储在内存缓存中。在应用程序启动时,只有一次写入操作,但会进行多次读取。由于在ASP.NET环境下访问此缓存,因此会涉及多个线程。
我需要查找此缓存中的一行,其中我的值介于StartRange和EndRange之间(包括StartRange和EndRange)。这些范围不重叠,但可能稀疏。我发现最简单的方法是:
public MyClass Lookup(long value){
return _set.FirstOrDefault(d => value >= d.StartRange && value <= d.EndRange);
}
我已经尝试使用IOrderedEnumerable<T>
和SortedSet<T>
存储集合。SortedSet的速度要快一个数量级。HashSet<T>
在某种程度上比SortedSet略快。请问有关于使用最有效的集合类或更好的查找方法的建议将不胜感激。
struct
替代class
(并使其不可变)。100万次(8+8+4)字节为20 MB,但使用类会是这个数字的两倍。然后将它们存储在一个排序数组中,并使用二分搜索,就像下面回答的那样。 - Kris Vandermotten