Ваш код является кратким, как может быть. Оператор switch
на самом деле является таблицей переходов, поэтому он значительно быстрее, чем ряд операторов if()
, даже если вы объединяете операторы if
в выражения диапазона (например, if(1 <= x && x <= 5)
). А switch
«s набор case
заявления должен быть полного если вы хотите, чтобы покрыть каждый случай (поэтому вы не можете использовать switch
с нецелыми значениями (обратите внимание, что switch
со значением String
это специальный регистр).
Я не вижу очевидной математической взаимосвязи между случаями и многократным возвратом, которые могут быть использованы для его значительного упрощения. Однако вы можете реорганизовать код, который будет концептуально понятнее - я бы начал с удаления части income = hours *
и перенос его в автономную функцию, которая просто возвращает почасовую ставку:
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;
Тем не менее, гигантский блок switch
/case
по-прежнему не читается, даже если вы сбрасываете его в стиле, который я сделал, чтобы сохранить на вертикальном пространстве (поскольку C# нечувствителен к пробелу).
Один из вариантов, чтобы упростить его, по крайней мере, визуально, является метапрограммным с использованием Т4, что позволит сделать обслуживание проще тоже:
<#
using R = Tuple<Int32,Int32>;
R[] hourlyRates = new R[] {
new R(5, 5),
new R(7, 6),
new R(10, 7),
new R(15, 8),
new R(24, 10)
};
WriteLine("switch(hours) {");
for(Int32 r = 0, i = 1; r < hourlyRates.Length; i++) {
WriteLine("case {0}:", i);
if(i == hourlyRates[r].Item1) {
WriteLine("return {0};", hourlyRates[r].Item2);
r++;
if(r >)
}
}
WriteLine("}");
#>
... который будет генерировать ваши switch
на основе списка hourlyRates
, определенном в T4.
Вам также не хватает перерывов – OldProgrammer
Есть ли математическая зависимость между переменной case и множителем? Я не могу это различить. –
Почему вы используете ненужные случаи? просто оставьте их – Thibaut