【发布时间】:2015-10-01 23:13:06
【问题描述】:
我正在学习 IEnumerator 和 IEnumerable [一般是 c# 新手]。 我正在尝试从这个代码示例中学习:
class colors : IEnumerable , IEnumerator
{
private string[] cols;
private int iCurrent;
public colors()
{
cols = new string[] { "Red", "White", "Blue", "Yellow" };
iCurrent = -1;
}
public IEnumerator GetEnumerator()
{
return (IEnumerator)this;
}
}
代码中有更多内容,但我的问题是关于最后一行。
首先,我不明白将返回什么,也不完全理解代码中的这一行。是颜色 IEnumerator 类型,还是字符串类型。 这个指向哪里/在什么地方?
我记得第二次在 CPP 中我创建了迭代器,例如:
std::map<object>::iterator it
,然后我会在 for[需要添加 it.begin() , it.end()] 循环中使用它。现在我明白了,在我创建了这个迭代器/IEnumerator 之后,C# 有 foreach 循环,这将使我免于烦恼。但是有没有办法更容易/更快地创建它们?
【问题讨论】:
-
该示例不完整。它通过返回一个枚举器来实现 IEnumerable,但该类并未将自身实现为支持以这种方式返回的枚举器。为此,它需要定义一个名为 Current 的属性,以及 MoveNext 和 Reset 方法。假设目的是迭代该数组,GetEnumerator 返回 cols.GetEnumerator 会更有意义。但是,如果您遗漏的部分定义了 MoveNext 和 Reset 和 Current,那么将对象本身作为 IEnumerator 返回是非常有意义的。
-
所以无论如何,返回的 IEnumerator 对象是类颜色的。
-
@PaulKienitz 你是对的两次。第一个确实我留下了部分代码,那部分确实包含 Current , MoveNext 和 Reset.2nd 我尝试了 return cols.GetEnumerator 并且它给出了相同的输出
-
这个类实现了
IEnumerable的非泛型版本也有点奇怪。在现代代码中,该接口不像IEnumerable<T>那样经常使用。
标签: c#