如何获取此linq查询以访问上一行的信息

时间:2017-08-16 18:06:16

标签: c# linq

我是linq的新手,我正在试图弄清楚如何更改这个linq查询,以便它在哪里说prevPrice我正在访问前一行的价格

var items = Data.Where(i => i.Date <= startingDate)
                .Take(days + 1)
                .Average(i => (i.Price - i.prevPrice) * i.Volume);

5 个答案:

答案 0 :(得分:2)

您可以使用aggregate函数收集所有计算,然后从中获取平均值

var results = new List<int>();
data.Where(i => i.Date <= startingDate).Take(days)
    .Aggregate((a, b) =>
    {
        results.Add((b.price - a.price)*a.Volume);
        return b;
    });
var result = results.Average();

答案 1 :(得分:0)

一种不同的方法。 Linq非常简单foreach所以你可以使用自增量表示法来获取前后的元素。

int i = Data.Count();
int total = Data.Count();

Data = Data.OrderBy(o => o.Date);

var items = Data
    .Where(o => o.Date <= startingDate)
    .Take(days + 1)
    .Average(o => (o.Price - (i == total ? (0 * (i--)) : Data.ElementAt(total - (i--)).Price)) * o.Volume);

答案 2 :(得分:0)

这可能有用。我快速地掀起它,所以检查一致性。我什么时候会编辑:

var items = Data.Where(i => i.Date <= startingDate)
            .Take(days + 1)
            .Average(i => (
            i.Price - Data.Where(p => p.Date < i.Date)
            .OrderByDescending(p => p.Date)
            .FirstOrDefault(p => o.Price)
            ) * i.Volume);

答案 3 :(得分:0)

使用MoreLinq's Pairwise函数,可以避免额外的变量:

var items = Data.Where(i => i.Date <= startingDate)
            .Take(days + 1)
            .Pairwise( ( previous, current ) => ( current.Price - previous.Price ) * current.Volume )
            .Average();

Pairwise分别为resultSelector函数提供了前导和当前元素作为第一个和第二个参数,但第一个元素仅作为第二个元素的前任提供。

答案 4 :(得分:0)

只需使用重载的Select()调用,如下所示:

var whatYouNeed = Data.Where(i => i.Date <= startingDate)
            .Take(days + 1)
            .ToList(); // I'm too lazy to be fancy, so I'm gonna preempt the LINQ here.

var items = whatYouNeed
            .Select((item, index) => 
                new 
                { 
                    Current = item, 
                    Previous = whatYouNeed[(index == 0 ? 0 : index - 1)]
                })
            .Average(item => (item.Current.Price - item.Previous.Price) * i.Volume);

警告:我正在制作它,如果第一个元素,字面上是集合中的第一个项目,那么它会将第一个元素(再次)作为Previous 。如果您不喜欢这样,那么修改三元组以执行您想要的操作(或者为示例留下评论)。

希望这有帮助!