public static IEnumerable <Point2D> MovingAverage(this IList <Point2D> data, double windowSize) { if (data.Count == 0) { yield break; } var orderedData = data.OrderBy(p => p.X).ToList(); var slidingWindow = new SlidingWindow <Point2D>(orderedData, p => p.X, windowSize, WindowPositioningType.CenteredAtPosition); foreach (var point in orderedData) { slidingWindow.SetPosition(point.X); yield return(new Point2D(point.X, slidingWindow.Average(p => p.Y))); } }