在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


等效的C#会是什么样?

我不知道这是否行得通:

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


但是到目前为止,从我对C#的了解来看,上述内容无法按我的预期工作,而是无限循环。

最佳答案

您可以通过以下方式对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
}


如果您不想一直调用MoveNext,则可以编写扩展方法:

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


然后变成

using (var gen = MakeId().GetEnumerator()) {
    Console.WriteLine(gen.NextValue()); // 0
    Console.WriteLine(gen.NextValue()); // 1
    Console.WriteLine(gen.NextValue()); // 2
}

关于c# - C#中的生成器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40649831/

10-11 22:49