颠倒`IEnumerator`的行为

时间:2016-06-20 23:12:06

标签: c# iterator

我在C#中编写一个Iterator接口,其行为与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();
}

IEnumeratorMoveNext的{​​{1}}行为向后退。如果我的实现只是将Current包装为我的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; } } 在真正为假时将返回true并且我不知道如何在不改变枚举器的情况下检查枚举数是否为空。我怎么能?

1 个答案:

答案 0 :(得分: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;
    }
}

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