对于以下情况,最佳C#数据结构是什么?

时间:2012-04-13 23:12:26

标签: c# data-structures

我的申请要求如下。我需要存储看起来像这样的订单:

  • 每个订单都与特定的股票代码(字符串)相关,并且具有价格,交易量以及与之相关的买卖价格(布尔值)。

  • 我需要对与特定股票相关的所有订单执行多项操作,例如获取股票代码“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字典中添加一个与当前订单匹配的条目和approrpriate列表。

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

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

3 个答案:

答案 0 :(得分:1)

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

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

我认为您应该制作订单工具IEnumerable,然后使用List<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 Samples

答案 1 :(得分:1)

我会添加一个额外的字典,其中包含key = orderid,value = reference to stock to list in the stock of stock stock。

这将像一个索引,并给你恒定的时间删除。假设您的订单ID不同,它将以1:1映射。只需确保从两个词典中删除它。

正如评论中所建议的那样,我会建议您需要通过股票代码访问的计算金额的附加字典。这是对内存的恒定时间访问权衡。除非记忆是一个问题,否则这似乎有利于每次需要时计算它。 如果你得到一个新的订单,你可以更新总和,平均值等。请记住,如果你并行做的事情,你需要一些锁定,以确保你没有问题。

答案 2 :(得分:0)

我同意数据库是最佳选择的意见;它们是为这类事物而设计的。

如果你需要在内存中保留这些数据,并且每个代码确实有很多订单,那么我会选择Dictionary<string, SortedSet<Order>>。 SortedSet可以轻松找到最小/最大,以及快速插入/移除。