我有这个迭代器,并希望它在某些条件下停止,因此,有一个名为"条件"的第三个参数.
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)
不幸的是,这个参数在内部循环中没有改变,所以现在总是如此,因为它似乎只在第一次迭代时执行.
问题:如何在每次迭代中检查或执行"条件"?
参数是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
.
归档时间: |
|
查看次数: |
60 次 |
最近记录: |