2

我经常接到一些订单,我需要存储它们并从中建立一个聚合。订单将有一个 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:

当我收到订单时更新 a Dictionary<int,OrderBook>,将 key 作为订单 ID,并为该工具创建一个订单簿。

问题:这将处理更新事件,我可以检查订单是否已经存在,然后更新订单簿。然而,一个工具类型应该只有一个订单簿,这里违反了这个条件,因为工具“xyz”可能有多个添加订单通过,也使得操作变得困难。

选项 2:

更新 , 的字典Dictionary<OrderBook, List<int>>,其值作为订单 ID。

问题:这将解决上述问题,但是当我收到更新事件时,我必须检查每个值列表(即订单 ID 列表)以查看订单是否已经存在,因为工具类型是将是空的,我无法通过 OrderBook 键查看。

订单实时下降,存储和检索操作必须更高效(如果不是 O(1) 然后 O(logn)),请问有没有更好的方法来构建这个?

注意:OrderBook 是一种工具的所有订单的集合,并且对于该工具来说是唯一的。订单将针对特定价格的工具,并且同一工具将有许多订单。我从其他人(第三方库)获得订单以及事件,我负责构建订单簿。

4

2 回答 2

0

我认为这个问题是两个子问题的结合。

  1. 您正在跟踪整个输入的 OrderID。
  2. 您正在为每个项目维护唯一的订单簿。

在这种情况下,我建议维护这两个字典或者,您可以将其转换List<order>dictionary <int, order>订单簿以简化使用订单簿的搜索。

对于选项 1,您提到

然而,一个工具类型应该只有一个订单簿,这里违反了这个条件

您不会有多个订单簿,而是在字典条目中保持对同一订单簿的引用。

于 2013-09-12T07:47:38.953 回答
-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>

我想它应该对你有用。让我知道这是否有任何问题。

于 2013-09-12T08:01:54.493 回答