枚举器未能 return 第一个元素

Enumerator fails to return the first element

我在 class 中实现了 IEnumerator 接口。除了它从不 return 是 MyListContainer 中的第一个元素之外,它工作正常。只有剩下的。所以为了尝试解决这个问题,我使用了以下内容:

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

但它并没有再次 return 第一个结果。

关于如何解决这个问题有什么建议吗?或者第一个元素是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;
}

从 -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。但这是一个很好的练习,所以我不想让你失望。

对于@Ed 的回答,您可以将 post 增量移动到 return 语句内部:

return (EnumeratorPosition++ < MyListContainer.Count);