【问题标题】:Run once if x but twice if not x如果 x 则运行一次,如果不是 x 则运行两次
【发布时间】:2014-04-13 20:04:12
【问题描述】:

这是我当前的代码:

int max;
if(runOnce)
    max = 1;
else
    max = 2;

for(i=0;i<max;i++)
    //do stuff

它看起来很乱,我相信有更好的方法来做到这一点。

谢谢。

【问题讨论】:

  • 为什么看起来很乱?对我来说看起来不错。您可以将其减少int max = runOnce? 1 : 2;

标签: c# loops int logic


【解决方案1】:

如果您希望摆脱for-loop,一个简单的解决方案是将您的“做事”逻辑包装在一个方法中:

private void DoStuff() 
{
    // do stuff
}

然后当你想调用它时,只需执行以下操作:

DoStuff();
if (!runOnce) 
{
    DoStuff();
}

或者,如果您需要访问多个局部变量,您可能需要考虑使用lambda expression 而不是方法:

Action doStuff = () => 
{
    // do stuff
};

doStuff();
if (!runOnce) 
{
    doStuff();
}

【讨论】:

  • 是的,在我看来这是最好的方法。你摆脱了神奇的数字和整个for 循环,如果你只运行一次它就没有意义。就我个人而言,我也会将 !runOnce 更改为 runTwice 以避免负面情况,但这就是我自己
【解决方案2】:

这个怎么样:

for (int i = 0; i < (runOnce? 1 : 2); i++)

【讨论】:

  • 编译的东西怎么样。
  • @pierre-lucpineault 它编译得很好。用 c++ 编译器试了一下。 ideone.com/cj7E0k
  • 但是,我错过了将三元运算符括在括号内..更正它。
  • 现在好多了。在发布之前始终尝试您的代码。顺便说一句,这是 C#,而不是 C++。
【解决方案3】:

试试这个:

int max = (runOnce==true) ? 1 : 2;
for(i=0; i<max; i++)

? 运算符称为条件运算符,一般形式如下:

condition ? first_expression : second_expression;

如果condition 为真,则使用first_expression。否则使用second_expression

更多文档请查看here

最后但同样重要的是,正如 Sriram 在 cmets 中指出的那样,我们也可以使用

int max = runOnce ? 1 : 2;

【讨论】:

  • int max = runOnce? 1 : 2 绰绰有余:)
  • @SriramSakthivel 确定。但我希望对以前没有使用过它的用户更具可读性。我会更新我的帖子。谢谢!
【解决方案4】:

有时需要知道的一点是,布尔值true 在转换为整数时始终具有1 的值。所以这应该有效:

for( int i = (int)runOnce; i < 2; ++i )

如果runOnce 为假,则计算 (0, 1),或者如果为真,则跳过 0,仅在 i = 1 时运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 2013-08-05
    • 2021-02-05
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多