public static IEnumerable <Point2D> MedianFilter(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); var medianY = slidingWindow.Median(p => p.Y); yield return(new Point2D(point.X, medianY)); } }