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#的理解,上面的方法不会像我想的那样工作,而是无限循环。

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返回一个遍历集合的枚举数

相关文章:
  • 没有找到相关文章