LINQ查询以查找True Range

时间:2014-04-29 05:17:16

标签: c# linq

我无法解决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中进行。

2 个答案:

答案 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));