Added a sliding window extension for IEnumerable
This commit is contained in:
parent
554ab0557e
commit
5e3bb81140
|
|
@ -102,4 +102,44 @@ public class EnumerableExtensionsTest
|
||||||
|
|
||||||
Assert.Equal([[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]], actual);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Numerics;
|
||||||
|
|
||||||
namespace AdventOfCode.Extensions;
|
namespace AdventOfCode.Extensions;
|
||||||
|
|
||||||
|
|
@ -144,6 +145,18 @@ public static class EnumerableExtensions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static TValue[] GetCombination<TValue>(int[] innerIndices, TValue[] innerPool) =>
|
private static TValue[] GetCombination<TValue>(int[] indices, TValue[] values) =>
|
||||||
innerIndices.Select(i => innerPool[i]).ToArray();
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue