有没有办法减少这个switch语句?

时间:2017-02-16 21:35:05

标签: c# switch-statement case

我打算使用if语句,但我的作业要求我使用开关。

case 1:
case 2:
case 3:
case 4:
case 5: return income = hours * 5;

case 6:
case 7: return income = hours * 6;

case 8:
case 9:
case 10: return income = hours * 7; ;

case 11:
case 12:
case 13:
case 14:
case 15: return income = hours * 7; ;

case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24: return income = hours * 10;

default: return 0;

1 个答案:

答案 0 :(得分:1)

您的代码尽可能简洁。运行时的switch语句实际上是一个跳转表,因此它比一系列if()语句快得多,即使您将if语句合并到范围表达式中(例如{{1} }})。如果要覆盖每个案例,if( 1 <= x && x <= 5 )的{​​{1}}语句必须完成(这就是为什么你不能将switch用于非整数值(请注意,case的{​​{1}}值是特殊情况。)

我无法看到案例与它返回的被乘数之间存在明显的数学关系,这可以用来大大简化它。但是,您可以重构代码以便在概念上更容易理解 - 我首先删除switch部分并将其移至仅返回小时费率的独立函数:

switch

仍然,巨大的String / income = hours *块仍然无法读取,即使您以我为保存在垂直空间上所做的样式折叠它(因为C#对空格不敏感)。 / p>

至少在视觉上简化它的一个选择是使用T4进行元编程,这样可以使维护更容易:

int GetHourlyRate(int hours) {
    switch( hours ) {
        case 1: case 2: case 3: case 4: case 5:
            return 5;
        case 6: case 7:
            return 6;
        case 8: case 9: case 10:
            return 7;
        case 11: case 12: case 13: case 14: case 15:
            return 8; // you put 7 in your original example, is that correct and not a typo?
        default:
            if( hours <= 24 ) return 10;
            return 0; // or throw an exception?
    }
}

int hourlyRate = GetHourlyRate( hours );
return income = hours * hourlyRate;

...将根据T4文件中定义的switch列表生成case