2017-02-16 1 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

사례 변수와 배율 사이에 수학적 관계가 있습니까? 나는 하나를 식별 할 수 없다. –

+0

왜 불필요한 케이스를 사용합니까? 그냥 내버려 두십시오. – Thibaut

답변

1

코드는 간결합니다. 런타임시 switch 문은 실제로 점프 테이블이므로 if 문을 범위 식 (예 : if(1 <= x && x <= 5))으로 병합하더라도 일련의 if() 문보다 상당히 빠릅니다. 모든 경우에 적용하려는 경우 의 case 문 집합은 전체이어야합니다. 따라서 0이 아닌 값 (switchString 값은 특수한 경우입니다)과 함께 switch을 사용할 수 없습니다.

사례와 피연산자 사이에 명백한 수학적 관계가 있음을 알 수 없으므로 코드를 크게 단순화하는 데 사용할 수 있습니다. 개념적으로 이해하기 쉽도록 코드를 리팩터링 할 수 있습니다. 먼저 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#은 공백에 영향을받지 않음) 여전히 읽을 수 없습니다.

하나의 옵션은, 적어도 시각, 그것을 단순화하기 쉽게도 유지 보수 할 것이다, T4를 사용하여 metaprogram하는 것입니다 생성 할 ...

<# 
    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; 
} 
관련 문제