C# では、このswitch
ステートメントはケースが値の範囲にまたがることを許可しません。この目的で if-else ループを使用するという考えは気に入らないので、C# で数値範囲をチェックする他の方法はありますか?
質問する
19196 次
7 に答える
16
HashTable
それぞれを使用Dictionary
して のマッピングを作成できますCondition => Action
。
例:
class Programm
{
static void Main()
{
var myNum = 12;
var cases = new Dictionary<Func<int, bool>, Action>
{
{ x => x < 3 , () => Console.WriteLine("Smaller than 3") } ,
{ x => x < 30 , () => Console.WriteLine("Smaller than 30") } ,
{ x => x < 300 , () => Console.WriteLine("Smaller than 300") }
};
cases.First(kvp => kvp.Key(myNum)).Value();
}
}
この手法はswitch
、特にアクションが 1 行のみで構成される場合 (メソッド呼び出しなど) の一般的な代替手段です。
型エイリアスのファンなら、次のようにします。
using Int32Condition = System.Collections.Generic.Dictionary<System.Func<System.Int32, System.Boolean>, System.Action>;
...
var cases = new Int32Condition()
{
{ x => x < 3 , () => Console.WriteLine("Smaller than 3") } ,
{ x => x < 30 , () => Console.WriteLine("Smaller than 30") } ,
{ x => x < 300 , () => Console.WriteLine("Smaller than 300") }
};
于 2012-07-05T07:08:06.567 に答える
5
いいえ。もちろん、範囲が小さい場合は、
case 4:
case 5:
case 6:
// blah
break;
アプローチしますが、それ以外はありません。if
/を使用しelse
ます。
于 2012-07-05T06:56:50.763 に答える
4
範囲の間隔が一定の場合は、試すことができます
int num = 11;
int range = (num - 1) / 10; //here interval is 10
switch (range)
{
case 0:
Console.Write("1-10");
break; // 1-10
case 1:
Console.Write("11-20");
break; // 11-20
// etc...
}
出力は次のようになります。"11-20"
間隔が可変の場合は、次を使用しますif/else
于 2012-07-05T06:58:22.267 に答える
1
int b;
b = Int32.Parse(textBox1.Text);
int ans = (100-b)/3; //the 3 represents the interval
//100 represents the last number
switch(ans)
{
case 0:
MessageBox.Show("98 to 100");
break;
case 1:
MessageBox.Show("95 to 97");
break;
case 2:
MessageBox.Show("92 to 94");
break;
case 3:
MessageBox.Show("89 to 91");
break;
case 4:
MessageBox.Show("86 to 88");
break;
default:
MessageBox.Show("out of range");
break;
于 2013-06-24T13:15:25.280 に答える
1
いいえ、少なくともこれほど美しいものはありません。
また、C# 3.5 はありません。.NET 3.5 と C# 3.0 のみです。
于 2012-07-05T06:57:28.150 に答える
1
このようなことを試してください
private void ExecuteInRange(Dictionary<Range,Action<int>> ranges)
{
foreach (var range in ranges)
{
if (range.Key.Value < range.Key.Max && range.Key.Value > range.Key.Max)
range.Value(range.Key.Value);
}
}
public class Range
{
public int Min { get; set; }
public int Max { get; set; }
public int Value { get; set; }
}
于 2012-07-05T07:10:43.767 に答える
-1
一種のネストされた省略形の if-else が機能し、クリーンです。
myModel.Value = modelResult >= 20 ? 5 : modelResult >= 14 ? 4 : modelResult >= 5 ? 3 : modelResult >= 2 ? 2 : modelResult == 1 ? 1 : 0;
于 2013-06-21T14:46:07.310 に答える