【问题标题】:Enumerator fails to return the first element枚举器无法返回第一个元素
【发布时间】:2016-11-30 16:53:58
【问题描述】:

我在课堂上实现了IEnumerator 接口。除了它永远不会返回MyListContainer 中的第一个元素之外,它工作得很好。只有剩下的。因此,为了尝试解决这个问题,我使用了以下方法:

public void Reset(){ EnumeratorPosition = -1; }

但它没有再次返回第一个结果。

关于如何解决此问题的任何建议?还是第一个元素是 foreach 的份额?

public bool MoveNext()
{                
    EnumeratorPosition++;
    return (EnumeratorPosition < MyListContainer.Count);                
}

public void Reset()
{ EnumeratorPosition = 0; }

public object Current
{
    get { return MyListContainer[EnumeratorPosition]; }
}

public IEnumerator GetEnumerator()
{
    return (IEnumerator)this;
}

【问题讨论】:

  • 与其编写自己的枚举器,不如使用为您编写代码的yield return。或者 MyListContainer 可能已经实现了 IEnumerable。

标签: c# enumerator


【解决方案1】:

从 -1 开始 EnumeratorPosition,而不是 0。然后对 MoveNext() 的第一次调用移动到第一项,而不是第二项。

一个还没有开始枚举的枚举器没有指向任何东西——指向第一个元素之前的空虚。

在实现方面,这很简单。在其声明中将其初始化为-1,并在Reset()中将其设置为-1

private int _enumeratorPosition = -1;
public void Reset() { _enumeratorPosition = -1; }

public bool MoveNext()
{                
    _enumeratorPosition++;
    return (_enumeratorPosition < MyListContainer.Count);                
}

public object Current
{
    get { return MyListContainer[_enumeratorPosition]; }
}

...当您使用它时,由于它是(或非常应该是)私有字段,让我们将其重命名为 _enumeratorPosition,这样任何阅读您的代码的人都会立即知道它是什么。

话虽如此,您可以直接调用MyListContainer.GetEnumerator() 而不是自己编写。除了作为练习之外,我们大多数人很少使用IEnumerator。但这是一个很好的练习,所以我不想让你气馁。

【讨论】:

  • 确实如此。从概念上讲,枚举数在序列开始之前开始。
  • @Broadroad 你是如何初始化 EnumeratorPosition 的?你没有表现出来。
  • @Broad 在构造函数或字段定义中初始化EnumeratorPosition,除了Reset。 (只需按照 MSDN 示例msdn.microsoft.com/en-us/library/…
  • 这听起来很有希望。怎么做呢?我的意思是,初始化这只饥饿的小野兽?
【解决方案2】:

除了@Ed 的回答,您还可以将帖子增量移到return 语句内:

return (EnumeratorPosition++ < MyListContainer.Count);    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-22
    • 2019-10-25
    • 1970-01-01
    • 2012-04-03
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多