用于存储有序的字典 - 数据结构

时间:2013-09-12 07:22:11

标签: c#

我经常会有一些命令,我​​需要存储它们并从中构建聚合。订单将具有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)获得订单以及我负责建立订单。

2 个答案:

答案 0 :(得分:0)

我将此问题视为两个子问题的组合。

  1. 您正在跟踪输入的订单ID。
  2. 您正在维护每件商品的唯一订单。
  3. 在这种情况下,我建议保留两个词典 或者,您可以将订单中的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>

我想它应该适合你。如果有任何问题,请告诉我。