【发布时间】:2015-05-19 08:32:07
【问题描述】:
我的Main() 方法中有以下内容
Reeks r = new Reeks();
foreach(int i in r){
if(i < 1000){
Console.WriteLine(i);
}
}
我想要的是遍历Reeks 直到i > 1000 的值,其中i 是前一个值乘以2,即[1,2,4,8,16,32]。
Reeks 类看起来像这样
class Reeks : IEnumerable<int>, IEnumerator<int>
{
private List<int> reeks;
private int idx = -1;
public Reeks()
{
reeks = new List<int>() {1};
}
public IEnumerator<int> GetEnumerator()
{
return this;
}
IEnumerator IEnumerable.GetEnumerator()
{
return this;
}
public void Dispose()
{
}
public bool MoveNext()
{
if (idx < reeks.Count - 1)
{
idx++;
return true;
}
return false;
}
public void Reset()
{
idx = -1;
}
public int Current
{
get
{
if (idx == -1)
{
throw new InvalidOperationException("Enumeration has not started. Call MoveNext");
}
else
{
if (idx != 0)
{
reeks.Add((reeks[(idx-1)]*2));
}
return reeks[idx];
}
}
}
object IEnumerator.Current
{
get { return Current; }
}
}
问题在于它在第一次迭代后停止迭代,它只是在开头打印1,而不是之后应该出现的值。
【问题讨论】:
-
if (idx < reeks.Count - 1)在MoveNext中失败。这是一个家庭作业,你需要手动实现一个迭代器吗?否则,您可以轻松使用迭代器块。 -
@SriramSakthivel 不幸的是
-
在 Current 中添加到列表是非常危险的,不应该这样做。改为在 MoveNext 中执行!!!
-
你正在为家庭作业实施这些东西吗?哇——我见过的最没用的作业——这只适用于 .net/C#,而且它已经过时了(抱歉,它已经过时了,但我真的很想知道为什么你希望你的学生知道这些东西而不是对它有好感更一般的编程概念)
-
@CarstenKönig 我不同意。弄清楚迭代器是如何工作的可能是一个很好的练习。了解某事是如何工作的往往比仅仅假设它做了它所做的更好。
标签: c# ienumerable ienumerator