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