Mat*_*lin 8 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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我将订单存储在Dictionary <string,List <Order >>中.每个股票代码都是字典中的一个键,指向该股票的订单列表.我还会将字典匹配订单ID与股票代码相匹配.
为了添加新订单,我只需根据当前股票代码在字典中找到合适的订单列表,然后插入订单.我还会在orderstock字典中添加一个与当前订单匹配的条目和approrpriate列表.
为了找到最优惠的价格,我在字典中查找当前股票代码的订单列表,对列表进行排序并打印出最高订单.
删除是棘手的.我首先需要通过股票代码查找相应的清单.然后,我需要遍历该股票代码的所有订单,找到与当前订单ID匹配的订单并将其删除.如果当前股票代码有很多订单,这显然效率低下.这是存储此信息的最佳方式吗?
如果您要对大量数据执行此操作,请将其放入数据库中。这不是你想在课堂上做的事情。
但是,如果您使用一小组数据,则可以使用 LINQ 在代码中执行此操作。
我认为你应该让 Order 实现IEnumerable,然后使用 aList<Order>来存储你的订单。StockCode在 上创建一个公共属性Order,然后您可以使用 Linq 检索订单:
List<Order> orders = GetOrderList();
var ibmOrders = from o in orders
where o.StockCode == "IBM"
select o;
Run Code Online (Sandbox Code Playgroud)
从列表中删除项目非常简单:
List<Order> orders = GetOrderList();
var orderToRemove = (from o in orders
where o.ExchangeId == 1315
select o).FirstOrDefault();
if (orderToRemove != null) {
orders.Remove(orderToRemove);
}
Run Code Online (Sandbox Code Playgroud)
使用 Linq 按最佳价格查找非常好:
Order bestPricedOrder = (from o in orders
orderby Price
select o).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
有关更多精彩的 LINQ 技巧,请参阅101 LINQ 示例。