自定义迭代器的实现不会更改其中一个参数

Ano*_*ous 3 c# iterator

我有这个迭代器,并希望它在某些条件下停止,因此,有一个名为"条件"的第三个参数.

public static IEnumerable<long> Dates(long start, int step, bool condition)
{
    var k = start + step;

    while (condition)
    {
        k += step;
        yield return k;
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样称呼它:

var i = 0;

foreach (var k in Iterator.Dates(0, 5, i++ < 100))
{
    // Here goes infinite loop because (i++ < 100) is always true inside iterator
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个参数在内部循环中没有改变,所以现在总是如此,因为它似乎只在第一次迭代时执行.

问题:如何在每次迭代中检查或执行"条件"?

Gen*_*mer 8

参数是bool,但你需要这样的谓词函数:

public static IEnumerable<long> Dates(long start, int step, Func<bool> condition)
{
    var k = start + step;

    while (condition())
    {
        k += step;
        yield return k;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var i = 0;

foreach (var k in Dates(0, 5, () => i++ < 100))
{
    // Here goes infinite loop because (i++ < 100) is always true inside iterator
}
Run Code Online (Sandbox Code Playgroud)

评论

() => i++ < 100是lambda表达式,类似于boolean函数,没有返回的参数i++ < 100.