我经常会有一些命令,我需要存储它们并从中构建聚合。订单将具有ID,并且将存在与其关联的工具类型。订单还可以附加一些事件,例如添加,更新或删除。如果是更新事件,则订单不会附加工具类型,但订单ID将相同。例如:如果我订购了具有订单ID 100的工具“xyz”,稍后我可以获得一个事件来更新ID为100的订单20美元,并且不存在该事件的工具类型(订购)。
收到订单后,我需要为独特的工具建立一个订单簿,例如,工具“xyz”应该包含订单中所有收到的订单。
我的问题是我如何有效地存储它以及我应该使用哪种数据结构?
订单看起来像这样:
public class Order
{
public Order(Action add, int id, string instrument, int price)
}
订单簿:
public class OrderBook
{
public string Instrument;
public List<Order> AllOrders;
}
选项1:
我收到订单时更新Dictionary<int,OrderBook>
,并将密钥作为订单ID,并为该工具创建订单簿。
问题:这将处理更新事件,我可以检查订单是否已存在,然后更新订单簿。但是,仪器类型应该只有一个订单簿,这里违反了这个条件,因为仪器“xyz”可能会有多个Add命令通过,并且操作也很困难。
选项2:
更新Dictionary<OrderBook, List<int>>
字典,其值为订单ID。
问题:这将解决上述问题,但是当我收到更新事件时,我必须检查每个值列表(即订单ID列表)以查看是否订单已存在,因为工具类型将为空,我无法通过OrderBook键查看。
订单实时下降,存储和检索的操作必须更有效(如果不是O(1)然后是O(logn)),是否有更好的方法来构建它? / p>
注意:OrderBook是仪器所有订单的汇总,对于仪器而言是唯一的。订单将用于特定价格的工具,并且同一工具将有许多订单。 我从其他人(第三方lib)获得订单以及我负责建立订单。
答案 0 :(得分:0)
我将此问题视为两个子问题的组合。
在这种情况下,我建议保留两个词典
或者,您可以将订单中的List<order>
转换为dictionary <int, order>
,以简化订单中的搜索。
对于选项1,您提到了
然而,乐器类型应该只有一本订单簿,而且这个 这里违反了条件
您不会拥有多个订单簿,而是在字典条目中维护相同订单簿的引用。
答案 1 :(得分:-1)
试试这个。
public class Order
{
public Action Action { get; set; }
public int Id { get; set; }
public int Price { get; set; }
public Order(Action add, int id, int price){
//Initialize
}
}
public class Instrument
{
public string InstrumentName { get; set; }
public Dictionary<int, Order> OrderBook { get; set; }
public Instrument(string instrument)
{
InstrumentName = instrument;
//OrderBook = new List<Order>();
}
public void AddOrder(Order order)
{
//Check order exist condition
OrderBook.Add(order.Id, order);
}
}
然后使用List<Instrument>
我想它应该适合你。如果有任何问题,请告诉我。