我被要求在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");
对于任何错误或不正确的术语表示歉意,我是新的学徒员工。
答案 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或更小时就是这种情况。