Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将现有的Reset()、MoveNext()和Current绑定到C#中基于产量的迭代器中?_C#_Iterator_Yield Return - Fatal编程技术网

如何将现有的Reset()、MoveNext()和Current绑定到C#中基于产量的迭代器中?

如何将现有的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(

我有一个简单的类MyClass,它已经有Reset()、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
    语句实现
    GetEnumerator()
    like
    IEnumerator
    时,
    MoveNext
    Current
    将自动实现,参数类型
    T
    不应完全是
    MyClass
:

要使用foreach语句遍历集合 收集必须满足以下要求:

  • 其类型必须包括一个公共的无参数GetEnumerator方法,该方法的返回类型为类、结构或接口类型
  • GetEnumerator方法的返回类型必须包含名为Current的公共属性和名为 返回类型为布尔的MoveNext
这是从1到5的简单数字集合示例:

class MyCollection
{
    public IEnumerator<int> GetEnumerator()
    {
        for (int index = 1; index <= 5; index++) { 
            yield return index;
        }
    }
}
要点:

  • 应该对集合而不是枚举器调用
    foreach
  • 集合本身不需要实现
    MoveNext
    Current
    ,枚举器需要
  • 当您使用
    yield
    语句实现
    GetEnumerator()
    like
    IEnumerator
    时,
    MoveNext
    Current
    将自动实现,参数类型
    T
    不应完全是
    MyClass
:

要使用foreach语句遍历集合 收集必须满足以下要求:

  • 其类型必须包括一个公共的无参数GetEnumerator方法,该方法的返回类型为类、结构或接口类型
  • GetEnumerator方法的返回类型必须包含名为Current的公共属性和名为 返回类型为布尔的MoveNext
这是从1到5的简单数字集合示例:

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();}