【问题标题】:Reverse the behavior of `IEnumerator`反转 IEnumerator 的行为
【发布时间】:2016-06-20 23:12:06
【问题描述】:

我正在用 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();
}

这与MoveNextCurrentIEnumerator 行为相反。如果我有一个简单地将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;
    }
}

但在枚举数为空的情况下不起作用,因为hasNext 将在它真的为假时返回真,而且我不知道如何在不改变枚举数的情况下检查枚举数是否为空。我该怎么办?

【问题讨论】:

  • 第一次调用 MoveNext 会告诉您是否有任何项目。没有你什么都不能说
  • 另请注意,尽管这对学习来说很好,但任何真正的类都应该 (a) 遵循 C# 命名准则,其中通常包括 InitialCapitals 用于函数(HasNextNext())和( b) 还应执行标准IEnumeratorIEnumerator&lt;T&gt;
  • IEnumerator 不是 IEnumerator 的原因是什么?
  • @CompuChimp,camelCase 是项目的命名约定,所以我坚持使用它。
  • @SirRufo 无。我会在项目中更新它。

标签: c# iterator


【解决方案1】:

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

你不能。

那么你是怎么解决这个问题的呢?

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

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

【讨论】:

    猜你喜欢
    • 2017-10-15
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多