public bool TryPeek(int lookahead, out T value) { if (_Disposed == _state) { throw new ObjectDisposedException(GetType().Name); } if (0 > lookahead) { throw new ArgumentOutOfRangeException(nameof(lookahead)); } if (_Ended == _state) { value = default(T); return(false); } if (0 == lookahead) { if (_NotStarted == _state) { if (!MoveNext()) { value = default(T); return(false); } _state = _FirstRead; } value = _queue.Peek(); return(true); } bool read = false; value = default(T); while (_queue.Count <= lookahead) { if (!_inner.MoveNext()) { if (0 == _queue.Count) { _state = _Ended; } value = default(T); return(false); } value = _inner.Current; _queue.Enqueue(value); read = true; } // if this is our first peek out this far we shortcutted because we just read it so we return it if (read) { return(true); } value = _queue[lookahead]; return(true); }