枚举器未能 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);
我在 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);