在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/