【问题标题】:Can you determine the terminating boolean expression of a for loop dynamically?你能动态确定 for 循环的终止布尔表达式吗?
【发布时间】:2016-07-18 15:06:13
【问题描述】:

我处于这样一种情况,如果能够确定我在运行时用于 for 循环的终止语句的布尔表达式,那就太好了。或者用更简单的话来说,决定我是想要 i > 0,还是 i i。我知道您可以使用 lambdas 使迭代器在运行时递减或递增,这在 this SO 问题中进行了解释,但是对于终止符来说,是否可以采用相同的方式?

从我自己尝试使用System.Action 来充当匿名函数,因此我仍然可以访问 for 循环使用的对象,而内部操作具有一些逻辑来确定我是前进还是后退(这最终我意识到这不会起作用),似乎情况非常如此,如果可能的话,与 if/else 中只有两个循环相比,它要复杂得多,并且不值得所需的样板代码陈述。当然,我不可能是唯一一个对此感到疑惑的人!

编辑:对于那些不明白我在问什么的人,请关注第一段,第二段只是描述了我的努力。 itsme86 的回答非常简洁地描述了我想知道的可能性,当然前提是它可以运行。

【问题讨论】:

  • 真正的问题是为什么。你为什么要做这么迟钝和敏感的事情?
  • 一个函数会返回两个对象,一个布尔值和一个索引?
  • 您能否至少发布一个您想要 的伪代码示例。当然,你可以用变量替换 for 循环中的常量表达式,但不清楚你想如何定义它。
  • 你试图从外部环境访问本地人——这是不可能的。我可以想象的一种方法是将所有本地人提升到一个状态机,该状态机将所有信息分组到一个类中。不过那很恶心。如果调用者和 for 在同一范围内(例如本地),那么您当然可以为条件提供 Func<bool>,就像前面提到的 lambdas 一样。
  • @Bradley - 是的,这是可能的 - 是的,您可以将布尔表达式存储在变量中。您的最后一条评论说它不是“漂亮而优雅”,但您实际上并没有显示任何东西!如果没有具体的东西可以更好地表明您正在寻找什么(或者您尝试过的不是“漂亮而优雅”的东西),恐怕这个问题太宽泛了。

标签: c# for-loop boolean-expression


【解决方案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);

【讨论】:

  • 非常感谢您的努力,再次对您的困惑表示歉意。
【解决方案2】:

对于您提供的示例,您可以使用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) { ... }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 2023-03-13
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2017-06-04
    • 2018-10-09
    • 2017-03-12
    相关资源
    最近更新 更多