我试图写的实际查询比标题所暗示的要复杂一些.我有一个这样的订单列表:List<Order>,订单如下:
public class Order
{
private StockCodes _stockCode;
private bool _bidSide;
private int _volume;
private decimal _price;
}
Run Code Online (Sandbox Code Playgroud)
我需要在给定特定股票代码的情况下公布最佳买入价和交易量以及最佳卖出价和交易量.最佳报价定义为bidSide为true的最高价格.最佳卖价定义为bidSide为false的最低价格.
例如,给出股票代码"ABC"的以下数据:
{ bidSide: true, volume: 25, price: 25 }
{ bidSide: true, volume: 25, price: 25 }
{ bidSide: true, volume: 25, price: 5 }
{ bidSide: false, volume: 100, price: 1 }
{ bidSide: false, volume: 50, price: 2}
{ bidSide: false, volume: 75, price: 8 }
Run Code Online (Sandbox Code Playgroud)
最佳出价:价格25,成交量50(因为最高价格有2个订单)最畅销:价格1,成交量100(因为最低价格只有1个订单)
最后,我需要考虑什么时候没有买入或卖出订单.效率是高优先级,所以如果我能够在一个首选的linq语句中这样做.
要有效地执行此操作,您实际上只想迭代数据一次.不幸的是,这使用LINQ实现真正的痛苦,因为还有很多工作要做.
我个人建议你不要用LINQ做这个 - 你可以实现它Aggregate,但它不会非常愉快.foreach虽然简单的循环并不算太糟糕.就像是:
int buyVolume = -1;
int sellVolume = -1;
decimal buyPrice = decimal.MinValue;
decimal sellPrice = decimal.MaxValue;
foreach (var order in orders)
{
if (order.bidSide)
{
if (order.Price > buyPrice)
{
buyPrice = order.Price;
buyVolume = order.Volume;
}
else if (order.Price == buyPrice)
{
buyVolume += order.Volume;
}
}
else
{
if (order.Price < sellPrice)
{
sellPrice = order.Price;
sellVolume = order.Volume;
}
else if (order.Price == sellPrice)
{
sellVolume += order.Volume;
}
}
}
// Check sellVolume == -1 to verify whether we've seen any sale orders
// Check buyVolume == -1 to verify whether we've seen any buy orders
// Use buyPrice/buyVolume and sellPrice/sellVolume otherwise
Run Code Online (Sandbox Code Playgroud)
在LINQ中尽可能高效地执行它实际上意味着将循环中的所有逻辑放入要传递的函数中Aggregate- 并且您可能希望创建一个自定义值类型来保存四个值,以避免创建比您更多的对象需要.这可能有点矫枉过正,但你确实说过你希望它尽可能高效......
| 归档时间: |
|
| 查看次数: |
321 次 |
| 最近记录: |