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

C# 枚举器无法返回第一个元素,c#,enumerator,C#,Enumerator,我在类中实现了IEnumerator接口。它工作得很好,只是它从不返回MyListContainer中的第一个元素。只有剩下的。因此,为了解决这个问题,我使用了以下方法: public void Reset(){ EnumeratorPosition = -1; } 但它没有再次返回第一个结果 有没有关于如何解决这个问题的建议?或者第一个元素是foreach的份额 public bool MoveNext() { EnumeratorPosition++

我在类中实现了
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;
}
public bool MoveNext()
{                
枚举位置++;
返回(EnumeratorPosition
Start
EnumeratorPosition
at-1,而不是0。然后,对
MoveNext()
的第一个调用将移动到第一项,而不是第二项

一个尚未开始枚举的枚举数没有指向任何东西——指向第一个元素之前的空白处

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

private int\u枚举位置=-1;
public void Reset(){u enumeratorPosition=-1;}
公共图书馆
{                
_枚举位置++;
返回(_enumeratorPosition
…当您使用它时,由于它是(或应该是)一个私有字段,让我们将其重命名为
\u enumeratorPosition
,以便任何阅读您的代码的人都会立即知道它是什么


综上所述,您可以调用MyListContainer.GetEnumerator()
,而不是编写自己的。对于我们大多数人来说,除了作为练习之外,很少实现
IEnumerator
。但这是一个很好的锻炼,所以我不想让你泄气

Start
EnumeratorPosition
at-1,而不是0。然后,对
MoveNext()
的第一个调用将移动到第一项,而不是第二项

一个尚未开始枚举的枚举数没有指向任何东西——指向第一个元素之前的空白处

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

private int\u枚举位置=-1;
public void Reset(){u enumeratorPosition=-1;}
公共图书馆
{                
_枚举位置++;
返回(_enumeratorPosition
…当您使用它时,由于它是(或应该是)一个私有字段,让我们将其重命名为
\u enumeratorPosition
,以便任何阅读您的代码的人都会立即知道它是什么


综上所述,您可以调用MyListContainer.GetEnumerator()
,而不是编写自己的。对于我们大多数人来说,除了作为练习之外,很少实现
IEnumerator
。但这是一个很好的锻炼,所以我不想让你泄气

除@Ed的答案外,您还可以将post increment移到return语句中:

return (EnumeratorPosition++ < MyListContainer.Count);    
return(EnumeratorPosition++
除了@Ed的答案,您还可以将post增量移到return语句中:

return (EnumeratorPosition++ < MyListContainer.Count);    
return(EnumeratorPosition++
的确如此。从概念上讲,枚举数在序列开始之前启动一个。@Broadroad如何初始化枚举位置?您没有显示它。@Broadroad在构造函数或字段定义中初始化
枚举位置
,以及
重置
。(只需遵循MSDN示例)这听起来很有希望。你是怎么做到的?我是说,把这只饥饿的小野兽丑化?真的。从概念上讲,枚举数在序列开始之前启动一个。@Broadroad如何初始化枚举位置?您没有显示它。@Broadroad在构造函数或字段定义中初始化
枚举位置
,以及
重置
。(只需遵循MSDN示例)这听起来很有希望。你是怎么做到的?我的意思是,把这个饥饿的小野兽形象化?与其自己编写枚举器,为什么不使用为你编写代码的枚举器呢。或者,MyListContainer可能已经实现了IEnumerable。与其编写自己的枚举器,不如使用为您编写代码的枚举器。或者,MyListContainer可能已经实现了IEnumerable。