あなたのコードは可能な限り簡潔です。実行時の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ファイル。
出典
2017-02-16 22:01:33
Dai
また、ブレークがありません – OldProgrammer
ケース変数と乗数の間に数学的な関係はありますか?私はそれを見分けることはできません。 –
なぜ不要なケースを使用しますか?ちょうどそれらを残してください – Thibaut