using System.Collections;
using System.Collections.Generic;
public static void Main()
var rdv = new RollingValues<int>(20);
for (var i = 0; i < 50; i++)
rdv.SetValue(r.Next(0,100));
Console.WriteLine("ValueSet: {0}", string.Join(",", rdv));
internal class RollingValues<T> : IEnumerable<T>
private int _currentIndex = 0;
public RollingValues(int capacity)
_items = new T[capacity];
public T this[int index] { get => _items[(index + _currentIndex) % Count]; }
public int Count => _count;
public bool IsReadOnly => false;
public void SetValue(T value)
if (_count < _items.Length)
_items[_currentIndex++] = value;
if (_currentIndex >= _items.Length)
_items[_currentIndex++] = value;
if (_currentIndex >= _items.Length)
public int GetHashCode(IEqualityComparer comparer)
return comparer.GetHashCode(_items);
public IEnumerator<T> GetEnumerator()
for (int i = 0; i < _count; i++)
IEnumerator IEnumerable.GetEnumerator()