如何将现有的Reset()、MoveNext()和Current绑定到C#中基于产量的迭代器中?
我有一个简单的类MyClass,它已经有Reset()、MoveNext()和当前片段。但它不提供迭代器,它只是公开这些组件 我从这个开始:如何将现有的Reset()、MoveNext()和Current绑定到C#中基于产量的迭代器中?,c#,iterator,yield-return,C#,Iterator,Yield Return,我有一个简单的类MyClass,它已经有Reset()、MoveNext()和当前片段。但它不提供迭代器,它只是公开这些组件 我从这个开始: public IEnumerator<MyClass> GetEnumerator() { Reset(); while (MoveNext()) yield return Current; } public IEnumerator GetEnumerator() { 重置(); while(MoveNext(
public IEnumerator<MyClass> GetEnumerator()
{
Reset();
while (MoveNext())
yield return Current;
}
public IEnumerator GetEnumerator()
{
重置();
while(MoveNext())
产生回流电流;
}
这会触发以下错误:
CS1579 foreach语句无法对“IEnumerator”类型的变量进行操作,因为“IEnumerator”不包含“GetEnumerator”的公共实例定义
我尝试了很多其他的方法,但没有乐趣
有人能给我指出正确的方向吗
谢谢 关键点:
- 应该对集合而不是枚举器调用
foreach
- 集合本身不需要实现
和MoveNext
,枚举器需要Current
- 当您使用
语句实现yield
likeGetEnumerator()
时,IEnumerator
和MoveNext
将自动实现,参数类型Current
不应完全是T
MyClass
- 其类型必须包括一个公共的无参数GetEnumerator方法,该方法的返回类型为类、结构或接口类型
- GetEnumerator方法的返回类型必须包含名为Current的公共属性和名为 返回类型为布尔的MoveNext
class MyCollection
{
public IEnumerator<int> GetEnumerator()
{
for (int index = 1; index <= 5; index++) {
yield return index;
}
}
}
要点:
- 应该对集合而不是枚举器调用
foreach
- 集合本身不需要实现
和MoveNext
,枚举器需要Current
- 当您使用
语句实现yield
likeGetEnumerator()
时,IEnumerator
和MoveNext
将自动实现,参数类型Current
不应完全是T
MyClass
- 其类型必须包括一个公共的无参数GetEnumerator方法,该方法的返回类型为类、结构或接口类型
- GetEnumerator方法的返回类型必须包含名为Current的公共属性和名为 返回类型为布尔的MoveNext
class MyCollection
{
public IEnumerator<int> GetEnumerator()
{
for (int index = 1; index <= 5; index++) {
yield return index;
}
}
}
我猜你的代码是这样的
foreach(var variable in collection.GetEnumerator())
{
//do some stuff
}
您可以省略GetEnumerator调用。如果您的类实现了IEnumerable,它将被自动调用
所以只要:
foreach(var variable in collection)
{
//do some stuff
}
我猜你的代码是这样的
foreach(var variable in collection.GetEnumerator())
{
//do some stuff
}
您可以省略GetEnumerator调用。如果您的类实现了IEnumerable,它将被自动调用
所以只要:
foreach(var variable in collection)
{
//do some stuff
}
您正在尝试使用foreach迭代哪个集合?请提供一个。我不明白你问题中的代码是如何产生上述编译器错误的。我解决了这个问题-我需要添加这个方法:System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator(){return GetEnumerator();}您正在尝试使用foreach迭代哪个集合?请提供一个。我不明白你问题中的代码是如何产生上述编译器错误的。我解决了这个问题-我需要添加这个方法:System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator(){return GetEnumerator();}