public static IEnumerable <double> AverageWindow(this IEnumerable <double> samples, int WindowLength) { if (samples is null) { throw new ArgumentNullException(nameof(samples)); } switch (WindowLength) { case < 1: throw new ArgumentOutOfRangeException(nameof(WindowLength), WindowLength, "Длина окна должна быть больше 0"); case 1: { foreach (var sample in samples) { yield return(sample); } yield break; } } var average = new AverageValue(WindowLength); foreach (var sample in samples) { yield return(average.AddValue(sample)); } }
public void AddValue_Test() { const int count = 10; var data = Enumerable.Range(0, count).Select(n => (double)n).ToArray(); var average = data.Average(); var average_value = new AverageValue(); foreach (var v in data) { average_value.AddValue(v); } Assert.AreEqual(average, average_value.Value); }
public void RollingAverage_Test() { const int count = 10; var data = Enumerable.Range(0, count).Select(n => (double)n).ToArray(); var average_value = new AverageValue(); var expected = new double[data.Length]; var actual = new double[data.Length]; for (var i = 0; i < data.Length; i++) { actual[i] = average_value.AddValue(data[i]); expected[i] = data.Take(i + 1).Average(); } CollectionAssert.AreEqual(expected, actual); }
public static IEnumerable <float> RollingAverage([NotNull] this IEnumerable <float> collection, int length) { var average = new AverageValue(length); return(collection.Select(value => (float)average.AddValue(value))); }