Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重构If语句_C#_.net_Wpf - Fatal编程技术网

C# 重构If语句

C# 重构If语句,c#,.net,wpf,C#,.net,Wpf,我必须为我的C#编程评估创建一个评分系统,目前我正在尝试重构冗余代码 foreach (Student item in mark) { if (ComboBoxGradeMethod.SelectedIndex == 0) { item.Grade = vetMethod.VETGrade(item.Mark); } else if (ComboBoxGradeMethod.SelectedIndex == 1) { ite

我必须为我的C#编程评估创建一个评分系统,目前我正在尝试重构冗余代码

foreach (Student item in mark)
{
    if (ComboBoxGradeMethod.SelectedIndex == 0)
    {
        item.Grade = vetMethod.VETGrade(item.Mark);
    }
    else if (ComboBoxGradeMethod.SelectedIndex == 1)
    {
        item.Grade = newVETMethod.VETGrade(item.Mark);
    }
    else if (ComboBoxGradeMethod.SelectedIndex == 2)
    {
        item.Grade = gradeMethod.CollegeGrade(item.Mark);
    }
    else
    {
        MessageBox.Show("Please select a grading scheme.");
    }
}
在这个“for each”循环中有3条if语句。我的一位朋友说,我可以通过创建一个方法并将函数作为参数传递来减少代码

我是一个初级程序员,他说的话我现在有点听不懂。 我在想我该怎么做呢? 我不想要完整的答案,只想知道如何去做。

一些建议

  • 尝试使用
    开关盒
    而不是
    if-else

  • 为等级分配创建
    函数

  • 尝试从代码中分离
    UI控件
    ,您可以从UI控件(如
    ComboBoxGradeMethod
    )获取变量的值,然后将其传递给函数。
    UI
    将来可能会更改,因此最好将业务逻辑与
    UI
    解耦


  • 假设
    item.Mark
    int
    item.Grade
    string
    那么我会这样做:

    var gradeFromMarkMethods = new Dictionary<int, Func<int, string>>()
    {
        { 0, vetMethod.VETGrade },
        { 1, newVETMethod.VETGrade },
        { 2, gradeMethod.CollegeGrade },
    };
    
    Func<int, string> gradeFromMark;
    if (gradeFromMarkMethods.TryGetValue(ComboBoxGradeMethod.SelectedIndex, out gradeFromMark))
    {
        foreach (Student item in mark)
        {
            item.Grade = gradeFromMark(item.Mark);
        }
    }
    else
    {
        MessageBox.Show("Please select a grading scheme.");
    }
    
    var gradeFromMarkMethods=new Dictionary()
    {
    {0,vetMethod.VETGrade},
    {1,newVETMethod.VETGrade},
    {2,gradeMethod.CollegeGrade},
    };
    Func评分标准;
    if(gradeFromMarkMethods.TryGetValue(ComboBoxGradeMethod.SelectedIndex,out gradeFromMark))
    {
    foreach(标记中的学生项目)
    {
    item.Grade=gradeFromMark(item.Mark);
    }
    }
    其他的
    {
    MessageBox.Show(“请选择评分方案”);
    }
    
    是否将其移动到某个方法取决于样式。但是,他会这样描述:
    public-void-grade(学生项目){}
    。此方法将包含除
    foreach
    之外的所有内容。然后将foreach重写为:
    foreach(标记中的学生项){AssignGrade(项);}
    。我不认为这是一个很大的改进,除非您当前的方法很大。您可能应该将
    if
    语句移出循环。目前,如果您不选择评分方案,您将收到许多消息框。@Tyress-谢谢。我很高兴你这么想。