我尝试编写的实际查询比标题所暗示的稍微复杂一些。我有一个这样的订单列表:List<Order>
,订单如下所示:
public class Order
{
private StockCodes _stockCode;
private bool _bidSide;
private int _volume;
private decimal _price;
}
我需要发布给定特定股票代码的最佳买价和成交量以及最佳卖出价和成交量。最佳出价定义为 bidSide 为真时的最高价格。最佳卖出价定义为 bidSide 为假时的最低价。
例如,给定股票代码“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 }
最佳出价:价格 25,数量 50(因为最高价有 2 个订单) Best sell: price 1, volume 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
在 LINQ 中尽可能高效地执行此操作实际上意味着将循环中的所有逻辑放入函数中以传递给 Aggregate
- 您可能想要创建一个自定义值类型来保存这四个值,以避免创建比您需要的更多的对象。这可能有点矫枉过正,但你确实说过你希望它尽可能高效......
关于c# - 如何获得linq中最高价和最低价商品的数量之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10165396/