我是linq的新手,我正在试图弄清楚如何更改这个linq查询,以便它在哪里说prevPrice我正在访问前一行的价格
var items = Data.Where(i => i.Date <= startingDate)
.Take(days + 1)
.Average(i => (i.Price - i.prevPrice) * i.Volume);
答案 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
。如果您不喜欢这样,那么修改三元组以执行您想要的操作(或者为示例留下评论)。
希望这有帮助!