我无法解决LINQ查询问题,为我提供开放式高低关闭系列的真实范围。
我有一组具有以下属性的对象栏
DateTime BarTime;
decimal Open;
decimal High;
decimal Low;
decimal Close;
目前我的LINQ查询看起来像
var TrueRange = bars.Select(b => b.High - b.Low);
我想做的不是使用b.High有Math.Max(b.High,previousBarsClose)和b相同。没有Math.Min(b.Low,previousBarsClose)
任何想法如何实现这一点,我想我必须加入2个条形实例加入BarTime = BarTime of Previous Bar,但不知道如何在LINQ中进行。
答案 0 :(得分:2)
您可以跳过第一个元素,然后使用重载的Select
方法,该方法可以访问索引。使用索引,您可以访问数组中的前一个元素。如果原始集合允许您使用索引器(例如数组或列表),则此方法将起作用。
var query = bars.Skip(1)
.Select((b, i) => Math.Max(b.High, bars[i].High) -
Math.Min(b.Low, bars[i].Low));
注意:索引i
将从0开始。由于我们跳过第一个元素,因此使用bars[i]
将引用前一个元素。
答案 1 :(得分:2)
任何想法如何实现这一点,我想我必须加入2个条形实例加入BarTime =上一个Bar的BarTime
这是一个可能的解决方案。您可以使用Skip
/ Zip
(作为使用索引器的Ahmand's answer的替代方法):
var TrueRange = bars.Skip(1).Zip(bars,
(b, p) => Math.Max(b.High, p.Close) - Math.Min(b.Low, p.Close));