У меня есть простая реализация последовательности Фибоначчи с помощью BigInteger:
internal class FibonacciEnumerator : IEnumerator<BigInteger>
{
private BigInteger _previous = 1;
private BigInteger _current = 0;
public void Dispose(){}
public bool MoveNext() {return true;}
public void Reset()
{
_previous = 1;
_current = 0;
}
public BigInteger Current
{
get
{
var temp = _current;
_current += _previous;
_previous = temp;
return _current;
}
}
object IEnumerator.Current { get { return Current; }
}
}
internal class FibonacciSequence : IEnumerable<BigInteger>
{
private readonly FibonacciEnumerator _f = new FibonacciEnumerator();
public IEnumerator<BigInteger> GetEnumerator(){return _f;}
IEnumerator IEnumerable.GetEnumerator(){return GetEnumerator();}
}
Это неограниченная последовательность, так как MoveNext()
всегда возвращает true.
При вызове с использованием
var fs = new FibonacciSequence();
fs.Take(10).ToList().ForEach(_ => Console.WriteLine(_));
выход как ожидалось (1,1,2,3,5,8,...)
Я хочу выбрать 10 элементов, но начиная со 100-й позиции. Я попробовал позвонить через
fs.Skip(100).Take(10).ToList().ForEach(_ => Console.WriteLine(_));
но это не работает, поскольку он выводит десять элементов с самого начала (т.е. выход снова 1,1,2,3,5,8,...).
Я могу пропустить его, вызвав SkipWhile
fs.SkipWhile((b,index) => index < 100).Take(10).ToList().ForEach(_ => Console.WriteLine(_));
который правильно выводит 10 элементов, начиная с 100-го элемента.
Есть ли что-то еще, что нужно/может быть реализовано в перечислителе, чтобы сделать работу Skip(...)
?