8

我的申请要求如下。我需要存储如下所示的订单:

  • 每个订单都与特定的股票代码(字符串)相关,并具有与其相关的价格、数量以及是否被买入或卖出(布尔值)。

  • 我需要对与特定股票相关的所有订单执行多项操作,例如获取股票代码“abc”的订单量总和。

  • 我需要能够向数据结构添加订单

  • 我需要能够从数据结构中删除订单

  • 在添加或删除订单后,我需要能够找出哪个订单提供最优惠的价格。

到目前为止,这是我的想法:

public class Order : IComparable
{

   private string _StockCode;
   private bool _BidSide;
   private int _Volume;
   private decimal _Price;
   private int _ExchangeOrderId;

   public int CompareTo(Order other)
   {
        if (_BidSide != other.BidSide)
        {
            return _BidSide ? 1 : -1;
        }
        return decimal.Compare(_Price, other.Price);
   }
}

然后我会将订单存储在 Dictionary<string, List<Order>> 中。每个股票代码都是字典中的一个键,指向该股票的订单列表。我还将维护将订单 ID 与股票代码匹配的字典。

  • 要添加新订单,我只需根据当前股票代码在字典中找到适当的订单列表,然后插入订单。我还将在 orderstock 字典中添加一个条目,将当前订单与适当的列表匹配。

  • 为了找到最好的价格,我在字典中查找当前股票代码的订单列表,对列表进行排序并打印出最高的订单。

  • 删除很棘手。我首先需要按股票代码查找适当的列表。然后,我需要遍历该股票代码的所有订单,并找到与当前订单 ID 匹配的订单并将其删除。如果当前股票代码有很多订单,这显然是低效的。这是存储这些信息的最佳方式吗?

4

3 回答 3

1

我将添加一个额外的字典,其中包含 key = orderid,value = 对股票代码初始字典中列表中订单的引用。

这将像一个索引,并给你不断的时间删除。假设您的订单 ID 不同,它将按 1:1 映射。只要确保从两个字典中删除它即可。

正如评论中所建议的那样,我会推荐一个额外的字典,其中包含您需要通过股票代码访问的计算总和。这是权衡内存的恒定时间访问。除非内存是一个问题,否则这似乎有利于每次需要时计算它。如果您收到新订单,您只需更新总和、平均值等。请记住,如果您正在并行执行操作,您将需要一些锁定以确保您没有问题。

于 2012-04-13T23:47:31.453 回答
1

如果您要对大量数据执行此操作,请将其放入数据库中。这不是你想在课堂上做的事情。

但是,如果您使用的是一小组数据,则可以使用 LINQ 在代码中执行此操作。

我认为您应该让 Order 实现IEnumerable,然后使用 aList<Order>来存储您的订单。在StockCode上创建一个公共属性Order,然后您可以使用 Linq 检索订单:

List<Order> orders = GetOrderList();

var ibmOrders = from o in orders
    where o.StockCode == "IBM"
    select o;

从列表中删除项目非常简单:

List<Order> orders = GetOrderList();

var orderToRemove = (from o in orders
  where o.ExchangeId == 1315
  select o).FirstOrDefault();

if (orderToRemove != null) {
    orders.Remove(orderToRemove);
}

使用 Linq 以最优惠的价格查找非常好:

Order bestPricedOrder = (from o in orders 
        orderby Price 
        select o).FirstOrDefault(); 

有关更多出色的 LINQ 技巧,请参阅101 LINQ 示例

于 2012-04-13T23:27:18.073 回答
0

我同意数据库将是最佳选择的评论;它们是为这种类型的东西设计的。

如果您需要在内存中保存这些数据,并且每个代码确实有很多订单,那么我会选择Dictionary<string, SortedSet<Order>>. SortedSet 将使查找最小值/最大值变得容易,以及快速插入/删除。

于 2012-04-13T23:30:38.880 回答