示例#1
0
        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);
        }