Added a sliding window extension for IEnumerable

This commit is contained in:
Buddhism8003 2026-01-30 21:55:40 +01:00
parent 554ab0557e
commit 5e3bb81140
2 changed files with 55 additions and 2 deletions

View File

@ -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);
}
}

View File

@ -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<TValue>(int[] innerIndices, TValue[] innerPool) =>
innerIndices.Select(i => innerPool[i]).ToArray();
private static TValue[] GetCombination<TValue>(int[] indices, TValue[] values) =>
indices.Select(i => values[i]).ToArray();
public static IEnumerable<TValue[]> SlidingWindow<TValue>(this IEnumerable<TValue> values, int count)
{
var queue = new Queue<TValue>(count);
foreach (var value in values)
{
queue.Enqueue(value);
if(queue.Count > count)
queue.Dequeue();
yield return queue.ToArray();
}
}
}