枚举器无法返回第一个元素

时间:2016-11-30 16:53:59

标签: c# enumerator

我在班上实现了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;
}

2 个答案:

答案 0 :(得分:4)

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

尚未开始枚举的枚举器指向任何东西 - 在第一个元素之前的哨声空白处。

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

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()而不是写自己的。{1}}。除了作为练习之外,我们大多数人很少实施IEnumerator。但这是一个很好的练习,所以我不想劝阻你。

答案 1 :(得分:0)

除了@ Ed的回答,你可以将后增量移到return语句中:

return (EnumeratorPosition++ < MyListContainer.Count);