繁体   English   中英

以下情况的最佳C#数据结构是什么

[英]What is the best C# Data Structure(s) For the Following Situation

我的应用程序要求如下。 我需要存储如下所示的订单:

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

  • 我需要对与特定股票相关的所有订单执行多项操作,例如,获取股票代码“ 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与股票代码匹配的Dictionary。

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

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

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

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

但是,如果使用少量数据,则可以使用LINQ在代码中进行。

我认为您应该使Order实现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示例

我将添加一个附加的词典,该词典由key = orderid,value =对股票代码的初始词典中的列表中的订单的引用组成。

这将像一个索引,并为您提供恒定的时间删除。 假设您的订单ID不同,它将按1:1映射。 只需确保将其从两个词典中删除即可。

正如评论中所建议的那样,我建议您使用股票代码访问所需的计算出的总和的其他词典。 这需要权衡对内存的恒定访问。 除非存在内存问题,否则似乎每次需要时都适合进行内存计算。 如果您有新订单,则可以更新总和,平均值等。请记住,如果您并行进行工作,则需要进行一些锁定以确保没有问题。

我同意这样的意见,即数据库将是最佳选择。 它们是为这类事情而设计的。

如果您需要保留内存中的数据,并且每个代码确实有很多Orders,那么我将使用Dictionary<string, SortedSet<Order>> SortedSet将使查找最小值/最大值变得容易,并且可以快速插入/移除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM