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#的理解到目前为止,上述内容不会像我想要的那样工作,而是无限循环.
您可以通过以下方式对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)