2017-02-16 38 views
0

Я собирался использовать оператор if, но мое задание требует от меня использовать переключатель.есть ли способ уменьшить этот оператор switch?

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; 
+2

Вам также не хватает перерывов – OldProgrammer

+1

Есть ли математическая зависимость между переменной case и множителем? Я не могу это различить. –

+0

Почему вы используете ненужные случаи? просто оставьте их – Thibaut

ответ

1

Ваш код является кратким, как может быть. Оператор 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.

0

У вас может потребоваться использование оператора switch, но, я полагаю, вы также можете использовать другие операторы.

var values = new[] { 1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4 }; 

int value; 
if (hours > 0 && hours < 25) 
    value = values[hours]; 
else 
    value = 0; 

switch (value) 
{ 
    case 1: return hours * 5; 
    case 2: return hours * 6; 
    case 3: return hours * 7; 
    case 4: return hours * 10; 
    default: return 0; 
}