可以动态确定for循环的终止布尔表达式吗
本文关键字:终止 布尔表达式 循环 for 动态 | 更新日期: 2023-09-27 17:57:25
我现在的处境是,如果能够确定在运行时为for循环的终止语句使用哪个布尔表达式,那将是一件非常好的事情。或者用更简单的话来说,决定我是想要I>0,还是I<file.length和递减或递增CCD_ 1。我知道你可以在运行时使用lambdas来使迭代器递减或递增,正如这个SO问题中所解释的那样,但终止符也可以这样做吗?
从我自己尝试用System.Action
作为一个匿名函数,这样我仍然可以访问for循环使用的对象,同时在内部操作中有一些逻辑来确定我是向前还是向后(这最终让我意识到这行不通),这似乎是非常可能的,如果可能的话,与if/else语句中只有两个循环相比,它要复杂得多,不值得使用所需的样板代码。当然,我不可能是唯一一个对此感到惊讶的人!
编辑:对于那些不明白我在问什么的人,请关注第一段,第二段只是描述我的努力。itsme86的答案非常简洁地描述了我想知道的可能,当然前提是它能运行。
您可以用委托替换循环中的条件。像这样的东西有效:
int i = 0;
Func<bool> predicate = () => i < 5;
for (; predicate(); ++i)
Console.WriteLine(i);
如果您想要不同的条件,只需为谓词指定不同的委托即可。
编辑:这可能是一个更清晰的例子:
Func<int, bool> countToFive = num => num < 5;
Func<int, bool> countToTen = num => num < 10;
var predicate = countToFive;
for (int i = 0; predicate(i); ++i)
Console.WriteLine(i);
对于您给出的示例,您可以使用IEnumerable
和foreach
:
IEnumerable<int> forward = Enumerable.Range(0, file.Length);
IEnumerable<int> backward = Enumerable.Range(0, file.Length)
.Select(i => file.Length - i);
var sequence = forward; // or backward
foreach (int i in sequence) { ... }