c#中的生成器
本文关键字: | 更新日期: 2023-09-27 18:18:15
在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#
是:
static void Main()
{
var enumerator = MakeId().GetEnumerator();
enumerator.MoveNext();
Console.WriteLine(enumerator.Current); // 0
enumerator.MoveNext();
Console.WriteLine(enumerator.Current); // 1
enumerator.MoveNext();
Console.WriteLine(enumerator.Current); // 2
}
static IEnumerable<int> MakeId()
{
int index = 0;
while (true)
yield return index++;
}
GetEnumerator
返回一个遍历集合的枚举数