你能动态地确定for循环的终止布尔表达式吗?

时间:2016-07-18 15:06:13

标签: c# for-loop boolean-expression

我处于这样一种情况,即能够确定我在运行时用于for循环的终止语句的布尔表达式真的很棒。或者用更简单的词来决定我是否想要我&gt; 0,或i < file.length和分别递减或递增i。我知道你可以使用lambdas来使迭代器在运行时递减或递增,在this SO问题中解释,但是对于终结符来说可能是相同的行吗?

尝试自己尝试使用System.Action充当匿名函数,这样我仍然可以访问for循环使用的对象,同时在内部操作中有一些逻辑来确定我是向前还是向后(这个结果我意识到这不会起作用),似乎情况非常如此,如果可能的话,它会变得更加复杂,并且与仅仅有两个相比,它不值得所需的样板代码在if / else语句中循环。我当然不是唯一一个对此感到疑惑的人!

编辑:对于那些不理解我所要求的人,专注于第一段,第二段只是描述了我的努力。 itsme86的回答非常简洁地描述了我想知道的可能性,当然也提供了它。

2 个答案:

答案 0 :(得分:1)

您可以使用委托替换循环中的条件。这样的事情有效:

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);

答案 1 :(得分:0)

对于您提供的示例,您可以使用IEnumerableforeach

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) { ... }