2017-02-16 12 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ステートメントのセットはの完全なにする必要があります(とStringの値が特殊な場合は、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、使用してメタプログラミングすることです:で定義されてhourlyRatesリストに基づいて、あなたのswitchを生成します

<# 
    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("}"); 
#> 

は... 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; 
} 
関連する問題