Linq 最后一个 N 的平均值

本文关键字:平均值 最后一个 Linq | 更新日期: 2023-09-27 18:35:05

被看似简单的问题难倒了。我有

var SummaryCollection = (from n in ...long criteria with group by clause) 
into g select new 
{     MonthYear = g.Key, 
      Amount = g.Sum(p=>p.Amount)}).OrderBy(p=>p.MonthYear);
}

我现在得到的数据看起来像这样

Jan2009 $100
Feb2009 $134
... and so on

终于我有

  decimal avgAmount = (from x in SummaryCollection select x.Amount).Average();

我现在需要获取过去 N 个月的平均值,其中 N 由用户在文本框中输入。请告知如何使用 Linq 从有序集合中获取最后 N 的平均值。谢谢

Linq 最后一个 N 的平均值

如果您知道集合中的项目数(或使用Count()),则可以跳过前Count - N项:

 decimal avgAmount = SummaryCollection.Skip(SummaryCollection.Count() - N)
                                      .Select(x => x.Amount)
                                      .Average();

我创建了一个扩展方法,该方法使用不需要对序列调用.Count或多次迭代的Queue<T>

public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> @this, int n) {
    var queue = new Queue<T>(n + 1);
    foreach (var element in @this) {
        queue.Enqueue(element);
        if(queue.Count > n) queue.Dequeue();
    }
    return queue;
}

要使用它,如果你的列表被称为 sequence ,只需调用 sequence.TakeLast(n) 即可获取最后n条记录。