如何压缩我的if语句

时间:2014-08-14 08:54:55

标签: c# if-statement operation statements ternary

我被要求在Windows窗体应用程序中创建一个等级转换器。

下面的代码来自点击按钮。一旦用户将他们的标记输入“Markbox”并单击该按钮,if语句就会运行,它将找到正确的标记范围。然后它将显示与“Gradelb”中的标记相关的等级。

下面是按钮单击命令下的代码。我想缩小它以减少代码行空间并使其更易于管理。

void SubmitBtn_Click(object sender,EventArgs e)         {

        int mark = int.Parse(Markbox.Text);

        if (mark >= 45 && mark <= 50) Gradelb.Text = "A*";
        else if (mark >= 40 && mark < 45) Gradelb.Text = "A";
        else if (mark >= 35 && mark < 40)  Gradelb.Text = "B";
        else if (mark >= 30 && mark < 35) Gradelb.Text = "C";
        else if (mark >= 25 && mark < 30) Gradelb.Text = "D";
        else if (mark >= 20 && mark < 25) Gradelb.Text = "E";
        else if (mark >= 0 && mark < 20) Gradelb.Text = "U";
        else MessageBox.Show("Please enter a mark between 0-50");

对于任何错误或不正确的术语表示歉意,我是新的学徒员工。

1 个答案:

答案 0 :(得分:5)

string Gr = new string[] { "A*", "A", "B", "C", "D", "E", "U" };

if(mark >=0 && mark <= 50) 
    Gradelb.Text =  Gr[10 - Math.Max(4, (int)Math.Ceiling(mark/5f))];
else 
    MessageBox.Show("Please enter a mark between 0-100");

提醒一句:在生活了十年的单线生活之后,我可以告诉你一件事:无法保证此代码的效率高于你的。

<强>解释

由于他们链接的等级和标记范围遵循固定模式,我创建了一个等级数组,以便我可以通过数组索引引用每个等级。现在我需要的是一个可以将给定数字转换为索引的表达式。

46-50 => 0
40-45 => 1
and so on...

这可以通过将数字除以5来完成(因为这是示例中的组大小)。所以例如将41除以5会得到8.2。对它进行Ceiling()(返回最近或大于等于的整数)将得到9.从10减去这个值会得到第二组的索引(即A级)。

Math.Max()(返回两个参数中较大的一个)就是确保超出数组边界的值不会导致异常。当标记为15或更小时就是这种情况。