Here's a simple implementation:
public static IEnumerable<double> RollingAverage(this IEnumerable<double> values, int count) { var queue = new Queue<double>(); foreach (var v in values) { queue.Enqueue(v); if (queue.Count == count) { yield return queue.Average(); queue.Dequeue(); } } }
It could probably be improved, but it seems to work ...
EDIT: here's a slightly better version (she doesn't need to list the queue to calculate the average):
public static IEnumerable<double> RollingAverage(this IEnumerable<double> values, int count) { var queue = new Queue<double>(); double sum = 0.0; foreach (var v in values) { sum += v; queue.Enqueue(v); if (queue.Count == count) { yield return sum / count; sum -= queue.Dequeue(); } } }
Thomas levesque
source share