C#中的生成器?

the*_*sti 2 c# iterator generator enumerable

在javascript中我可以创建一个行为如下:

function* idMaker(){
  var index = 0;
  while(true)
    yield index++;
}

var gen = idMaker();

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
Run Code Online (Sandbox Code Playgroud)

C#等价物会是什么样的?

我想知道这是否会奏效:

static System.Collections.Generic.IEnumerable<int> MakeId()
{
  int index = 0;
  while (true)
    yield return index++;
}
Run Code Online (Sandbox Code Playgroud)

但是根据我对C#的理解到目前为止,上述内容不会像我想要的那样工作,而是无限循环.

Evk*_*Evk 6

您可以通过以下方式对MakeId执行相同的操作:

using (var gen = MakeId().GetEnumerator()) {
    gen.MoveNext();
    Console.WriteLine(gen.Current); // 0
    gen.MoveNext();
    Console.WriteLine(gen.Current); // 1
    gen.MoveNext();
    Console.WriteLine(gen.Current); // 2
}
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢一直打电话MoveNext,可以编写扩展方法:

public static class Extensions {
    public static T NextValue<T>(this IEnumerator<T> enumerator) {
        enumerator.MoveNext();
        return enumerator.Current;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后它变成了

using (var gen = MakeId().GetEnumerator()) {                
    Console.WriteLine(gen.NextValue()); // 0                
    Console.WriteLine(gen.NextValue()); // 1                
    Console.WriteLine(gen.NextValue()); // 2
}
Run Code Online (Sandbox Code Playgroud)