我怎样才能让这个等式在这个嵌套的 if/else 语句中为 c# 工作?

How can i get this equation to work within this nested if/else statement for c#?

在用户端获得 pass 20 后,我的 if/else 没有获取方程的下一个变体。我知道它是因为设置了总计 = (numberofchecks * twentychecks) + (fee);但我不知道用什么来让它移动到方程的下一个变体。负数、超过 1000 和格式异常有效。

总计 = (numberofchecks * twentychecks) + (费用)​​;

            TotalLabel.Text = total.ToString("C");

            // if else (5 or 6)

            if ( numberofchecks < 20 && numberofchecks == 0)
            {
                total = (numberofchecks * twentychecks) + (fee);
               
            }
            else if ( numberofchecks < -1)
            {
                MessageBox.Show("Number of checks must be between 0 and 1000");
            }
            else if (numberofchecks == 20 && numberofchecks <= 39)
            {
                total = (numberofchecks * thirtyninechecks) + (fee);
                
            }
            
            else if (numberofchecks == 40 && numberofchecks <= 59)
            {
                total = (numberofchecks * fiftyninechecks) + (fee);
                
            }
            else if (numberofchecks == 60 && numberofchecks <=1000)
            {
                total = (numberofchecks * thousandchecks) + (fee);
                
            }
            else if (numberofchecks > 1000)
            {
               MessageBox.Show("Number of checks must be between 0 and 1000");
            }
            
        }
        catch(FormatException )
        {
            MessageBox.Show(" Please enter a number");
        }

看代码,好像条件设置不正确。

更好的条件设置是始终首先检查不适当的情况。

因此可以将以下检查范围缩小为有效范围。

// Check inappropriate cases first to reduce the scope of other checks
if (numberofchecks < 0 || numberofchecks >= 1000) {
    MessageBox.Show("Number of checks must be between 0 and 1000");
} else {
    // Guess you don't want 20 to satisfy the twentychecks as well? 
    if (numberofchecks < 20) {
        // cases: 0 to 19
        total = (numberofchecks * twentychecks) + (fee);
    } else if (numberofchecks < 40) {
        // cases: 20 to 39
        total = (numberofchecks * thirtyninechecks) + (fee);
    } else if (numberofchecks < 60) {
        // cases: 40 to 59
        total = (numberofchecks * fiftyninechecks) + (fee);
    } else {
        // cases: 60 to 999
        total = (numberofchecks * thousandchecks) + (fee);
    }
    TotalLabel.Text = total.ToString("C");
}

首先,我们只看您的一个 if 语句,我们看到以下内容

else if (numberofchecks == 20 && numberofchecks <= 39)

嗯,如果 numberofchecks 等于 20,那么它总是 <= 39,所以第二部分是多余的。这对你所有的陈述都是一样的。

我想你的意思是

else if (numberofchecks >= 20 && numberofchecks <= 39)

那么,这样会更合乎逻辑。

这应该可以解决您眼前的问题。但我们可以进一步改进它。

一般最好先检查输入的数据是否有效。所以这应该首先完成。您甚至可以将其移至另一种方法。 (如果您要执行大量验证,则很有用)。然后你就可以进行计算了

if ( numberofchecks < -1 || numberofchecks > 1000)
{
        MessageBox.Show("Number of checks must be between 0 and 1000");
}
else
{    
    //Rest here
}

但如果您使用的是 C#9 或更高版本,您实际上可以将 if 语句移动到支持范围的 switch 语句。在这种情况下,我们也可以对无效数据使用默认大小写。

switch (numberofchecks)
{
    case >= 0 and < 20:
        total = (numberofchecks * twentychecks) + (fee);
        break;
    case >= 20 and <= 39:
        total = (numberofchecks * thirtyninechecks) + (fee);
        break;
    case >= 40 and < 59:
        total = (numberofchecks * fiftyninechecks) + (fee);
        break;
    case >= 60 and < 1000:
        total = (numberofchecks * thousandchecks) + (fee);
        break;
    default:
        MessageBox.Show("Number of checks must be between 0 and 1000");
        break;
}