From 5e3bb8114068caac0a0685418d0a269770f7a612 Mon Sep 17 00:00:00 2001 From: Buddhism8003 Date: Fri, 30 Jan 2026 21:55:40 +0100 Subject: [PATCH] Added a sliding window extension for IEnumerable --- .../EnumerableExtensionsTest.cs | 40 +++++++++++++++++++ .../EnumerableExtensions.cs | 17 +++++++- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/AdventOfCode.Extensions.Tests/EnumerableExtensionsTest.cs b/AdventOfCode.Extensions.Tests/EnumerableExtensionsTest.cs index 7f0e479..3d0bcde 100644 --- a/AdventOfCode.Extensions.Tests/EnumerableExtensionsTest.cs +++ b/AdventOfCode.Extensions.Tests/EnumerableExtensionsTest.cs @@ -102,4 +102,44 @@ public class EnumerableExtensionsTest Assert.Equal([[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]], actual); } + + [Fact] + public void SlidingWindowOver_none_1_equals_none() + { + int[] data = []; + + var actual = data.SlidingWindow(1).ToArray(); + + Assert.Equal([], actual); + } + + [Fact] + public void SlidingWindowOver_1_1_equals_1() + { + int[] data = [1]; + + var actual = data.SlidingWindow(1).ToArray(); + + Assert.Equal([[1]], actual); + } + + [Fact] + public void SlidingWindowOver_1234_2_equals_1_12_23_34() + { + int[] data = [1, 2, 3, 4]; + + var actual = data.SlidingWindow(2).ToArray(); + + Assert.Equal([[1], [1, 2], [2, 3], [3, 4]], actual); + } + + [Fact] + public void SlidingWindowOver_1234_3_equals_1_12_123_234() + { + int[] data = [1, 2, 3, 4]; + + var actual = data.SlidingWindow(3).ToArray(); + + Assert.Equal([[1], [1, 2], [1, 2, 3], [2, 3, 4]], actual); + } } \ No newline at end of file diff --git a/AdventOfCode.Extensions/EnumerableExtensions.cs b/AdventOfCode.Extensions/EnumerableExtensions.cs index 20c5efd..15da20b 100644 --- a/AdventOfCode.Extensions/EnumerableExtensions.cs +++ b/AdventOfCode.Extensions/EnumerableExtensions.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Numerics; namespace AdventOfCode.Extensions; @@ -144,6 +145,18 @@ public static class EnumerableExtensions } } - private static TValue[] GetCombination(int[] innerIndices, TValue[] innerPool) => - innerIndices.Select(i => innerPool[i]).ToArray(); + private static TValue[] GetCombination(int[] indices, TValue[] values) => + indices.Select(i => values[i]).ToArray(); + + public static IEnumerable SlidingWindow(this IEnumerable values, int count) + { + var queue = new Queue(count); + foreach (var value in values) + { + queue.Enqueue(value); + if(queue.Count > count) + queue.Dequeue(); + yield return queue.ToArray(); + } + } } \ No newline at end of file