你能动态地确定 for 循环的终止布尔表达式吗?
Can you determine the terminating boolean expression of a for loop dynamically?
我处于这样一种情况,如果能够确定我在运行时用于 for 循环的终止语句的布尔表达式,那将是非常好的。或者用更简单的话来说,决定我是想要 i > 0 还是 i < file.length 并分别递减或递增 i
。我知道你可以使用 lambdas 使迭代器在运行时递减或递增,在 this 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) { ... }
我处于这样一种情况,如果能够确定我在运行时用于 for 循环的终止语句的布尔表达式,那将是非常好的。或者用更简单的话来说,决定我是想要 i > 0 还是 i < file.length 并分别递减或递增 i
。我知道你可以使用 lambdas 使迭代器在运行时递减或递增,在 this 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) { ... }