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

本文关键字:最佳 数据结构 什么 情况 | 更新日期: 2023-09-27 18:30:59

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

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

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

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

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

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

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

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

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

但是,如果使用一小组数据,则可以使用 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 示例。

我会添加一个额外的字典,它由键 = orderid、value = 对股票代码初始字典中列表中顺序的引用组成。

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

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

我同意数据库是最佳选择的评论;它们是为这类事情设计的。

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