颠倒`IEnumerator`的行为

che*_*eak 0 c# iterator

我在C#中编写一个Iterator接口,其行为与a相同,IEnumerator但它具有不同的签名

public interface Iterator
{
    /// <summary>
    /// Check if there iterator has another value.
    /// </summary>
    /// <returns><c>true</c>, if there is another value <c>false</c> otherwise.</returns>
    bool hasNext();

    /// <summary>
    /// Move the iterator to the next object and return that object.
    /// </summary>
    /// <returns>The next object.</returns>
    object next();
}
Run Code Online (Sandbox Code Playgroud)

这是向后从IEnumerator行为MoveNextCurrent.如果我有一个实现只是包装一个IEnumerator作为我的Iterable

class EnumeratorWrap: Iterator
{
    private IEnumerator<object> _iter;
    private bool _hasNext = true;

    public Enumerator(IEnumerator<object> iter)
    {
        _iter = iter;
    }

    override public bool hasNext() 
    {
        return _hasNext;
    }

    override public object next()
    {
        _hasNext = _iter.MoveNext();
        return _iter.Current;
    }
}
Run Code Online (Sandbox Code Playgroud)

但它在空枚举器的情况下不起作用,因为hasNext当它真的是假的时候会返回true而我不知道如何在不改变枚举器的情况下检查枚举器是否为空.我怎么能够?

Eri*_*ert 5

我不知道如何在不改变枚举器的情况下检查枚举器是否为空.我怎么能够?

你不能.

那么你如何解决这个问题呢?

class EnumeratorWrap: Iterator
{
    private IEnumerator _iter;
    private bool _hasNext;
    private object _next;

    public EnumeratorWrap(IEnumerator iter)
    {
        _iter = iter;
        Next();
    }

    public bool HasNext() 
    {
        return _hasNext;
    }

    public object Next()
    {
        object current = _next;
        _hasNext = _iter.MoveNext();
        _next = _hasNext ? _iter.Current : null;
        return current;
    }
}
Run Code Online (Sandbox Code Playgroud)

故事的寓意:询问解决问题,而不是如何做一些你认为需要做的不可能的事情来解决问题.你实际上并不需要做那件事的可能性很大.