我正在尝试将大量股票市场报价数据存储到变量中以便在内存中查询。我需要能够快速找到股票ID的最新市场数据,并查询特定股票的特定历史长度。
例如,我可能每隔几秒钟收到一次股票ID 5342(总是数字)的数据......我原来的想法是建立一个SortedDictionary的数组,其中SortedDictionary键是引用的DateTime,其值是我自定义的市场数据结构。然后外部数组将是股票ID ...所以我可以调用:
RecentPrice = PriceData[StockID].Values.Last();
或者我可以通过该股票的SortedDictionary向后迭代,直到我按下比我正在寻找的时间范围更早的键。
然而,我觉得必须有一个更好(更有效)的方法。有什么想法吗?
编辑:而不是SortedDictionaries数组...... SortedDictionaries字典可能更好。 例如:
public static Dictionary<int, SortedDictionary<DateTime, StockData>> PriceData =
new Dictionary<int, SortedDictionary<DateTime, StockData>>();
然后:
RecentPrice = PriceData[StockID].Values.Last();
谢谢!
答案 0 :(得分:2)
字典和哈希表通常适用于完全匹配。但是当你想要“不早于X的第一个日期/时间”时,排序列表将表现最佳,因为查找是二进制搜索。特别是因为您只是附加数据而不是插入数据。
答案 1 :(得分:0)
如果您的StockID
值是连续的并且从零开始,则数组可能就足够了。在现实世界中,我想他们可能不是,所以字典词典很好。我经常使用它们来解决这类问题。
答案 2 :(得分:0)
您是否考虑过使用堆栈而不是SortedDictionary?如果始终以正确的顺序插入数据,某种自定义实现可以很好地工作。也许是一个链表。
如果您的数据按顺序进入,为什么不简单地将其存储在数组中?这样,您可以使用二进制搜索快速收敛到您想要的日期范围,您的插入操作也非常快。它确实浪费了一些记忆......
答案 3 :(得分:0)
如果您可以确保新来的股票代码数据按时间顺序排列,则SortedList是更好的选择。它消耗更少的内存,更快地插入和删除有序数据。
此外,如果您需要对数据进行各种查询。内存数据库是更好的选择。我使用SqlLite在我的一个项目中执行类似的功能,它很好地处理不同的需求,因为我可以使用sql。