重写多个return语句的简便方法

Ada*_*m S 2 c#

我有一些代码写得像这样:

private double function1()
{
    double result2 = function2();
    if (result2  < 0) { return result2; }

    double result3 = function3();
    if (result3  < 0) { return result3; }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我需要重新编写它,使它只有一个return语句.是否有捷径可寻?从使用两次相同的if构造开始,这对我来说是低效的.如何清除这种低效率?

Dan*_*haw 12

单线解决方案,不需要更改功能2/3.不是特别可读但有趣:

private double function1()
{
    return new Func<double>[] { function2, function3 }
        .Select(c => c()).FirstOrDefault(c => c < 0);
}
Run Code Online (Sandbox Code Playgroud)

就个人而言,我会选择你的原始版本.

  • @Jerod,@ Daneil,我的不好,我看不懂......你是对的.我整个时间都读错了条件标志.这实际上是一个非常灵活的解决方案. (4认同)

Hen*_*man 8

保持简单,保持可读性.

// direct conversion of your code
private double function1()
{
    double result = 0;

    double result2 = function2();
    if (result2  < 0) 
    {
      result =  result2; 
    }
    else
    {
       double result3 = function3();
       if (result3  < 0) 
       {
         result = result3; 
       }
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

一个较短的版本,可能更容易在眼睛上:

private double function1()
{
    double result = function2();

    if (result >= 0)   // if (!(result < 0))  to be safe for NaN
    {
       result = function3();
       if (result >= 0) 
       {
         result = 0; 
       }
    }    
    return result;
}
Run Code Online (Sandbox Code Playgroud)

从使用两次相同的if构造开始,这对我来说是低效的.

这没有什么低效率的.如果模式重复(更多),您可以开始考虑额外的方法或某些东西以提高可读性.

  • 对我来说,这看起来不像原版.(但它确实按照要求做了.) (14认同)