C# 反转“IEnumerator”的行为`

C# 反转“IEnumerator”的行为`,c#,iterator,C#,Iterator,我正在用C#编写一个迭代器接口,它的行为与IEnumerator相同,但它有一个不同的签名 public interface Iterator { /// <summary> /// Check if there iterator has another value. /// </summary> /// <returns><c>true</c>, if there is another value &l

我正在用C#编写一个迭代器接口,它的行为与
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();
}
但它在空枚举数的情况下不起作用,因为
hasNext
将在实际为false时返回true,我不知道如何在不改变枚举数的情况下检查枚举数是否为空。我该怎么办

我不知道如何在不改变枚举数的情况下检查枚举数是否为空。我该怎么办

你不能

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

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;
    }
}
这个故事的寓意是:询问如何解决问题,而不是如何做一些你认为需要做的不可能的事情来解决问题。很可能你实际上不需要做那件事

我不知道如何在不改变枚举数的情况下检查枚举数是否为空。我该怎么办

你不能

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

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;
    }
}

这个故事的寓意是:询问如何解决问题,而不是如何做一些你认为需要做的不可能的事情来解决问题。很有可能您实际上不需要这样做。

第一次呼叫MoveNext会告诉您是否有任何项目。此外,请注意,尽管这对于学习来说很好,但任何真正的类都应该(a)遵循C#命名准则,其中通常包括函数(
HasNext
Next()
)和(b)的
InitialCapitals
)还应实现标准的
IEnumerator
IEnumerator
。为什么使用IEnumerator而不是IEnumerator?@CompuChimp,camelCase是项目的命名约定,所以我坚持使用。@SirRufo none。我将在项目中更新它。第一次调用MoveNext将告诉您是否有任何项目。此外,请注意,尽管这对于学习来说很好,但任何真正的类都应该(a)遵循C#命名准则,其中通常包括函数(
HasNext
Next()
)和(b)的
InitialCapitals
)还应实现标准的
IEnumerator
IEnumerator
。为什么使用IEnumerator而不是IEnumerator?@CompuChimp,camelCase是项目的命名约定,所以我坚持使用。@SirRufo none。我会在项目中更新。