switch
ステートメントで次を実装する必要があります。
switch(num)
{
case 4:
// some code ;
break;
case 3:
// some code ;
break;
case 0:
// some code ;
break;
case < 0:
// some code ;
break;
}
Switchステートメントにcase < 0
を評価させることは可能ですか?そうでない場合、どうすればそれができますか?
できません-switch/caseは個々の値専用です。条件を指定する場合は、「if」が必要です。
if (num < 0)
{
...
}
else
{
switch(num)
{
case 0: // Code
case 1: // Code
case 2: // Code
...
}
}
このトピックはかなり古いことを知っていますが、C#7で今でも誰かが答えを探しているなら可能です。以下に例を示します。
switch (value)
{
case var expression when value < 0:
//some code
break;
case var expression when (value >= 0 && value < 5):
//some code
break;
default:
//some code
break;
}
Switchステートメントの最後に次のようなことを行うことができます。
default:
if(num < 0)
{
... // Code
}
break;
Numをゼロより小さくできない場合:
public int GetSwitch(int num) { return num < 0 ? -1 : num; }
switch(GetSwitch(num))
{
case 4: // some code ; break;
case 3:// some code ; break;
case 0: // some code ; break;
case -1 :// some code ; break;
}
可能であれば、int.MinValueなどの他の「存在しない」番号を使用します。
必要かどうかにかかわらず、使用する必要があります。スイッチは、値を定数値と比較することのみが可能です。
私が考えることができる唯一の方法(そして私は本当にそれをお勧めしません)、次のようになります:
int someValue;
switch (Math.Max(someValue, -1))
{
case -1:
// will be executed for everything lower than zero.
break;
case 0:
// will be executed for value 0.
break;
case 1:
// will be executed for value 1.
break;
default:
// will be executed for anything else.
break;
}
あなたはこれを行うことができます
switch (mark)
{
case int n when n >= 80:
Console.WriteLine("Grade is A");
break;
case int n when n >= 60:
Console.WriteLine("Grade is B");
break;
case int n when n >= 40:
Console.WriteLine("Grade is C");
break;
default:
Console.WriteLine("Grade is D");
break;
}
他の方法も可能です(ジョンスキートの答えに関連):
switch(num)
{
case a:
break;
default:
if( num < 0 )
{}
break;
}
できることは、このようなデリゲートを使用することです。
var actionSwitch = new Dictionary<Func<int, bool>, Action>
{
{ x => x < 0 , () => Log.Information("0")},
{ x => x == 1, () => Log.Information("1")},
{ x => x == 2, () => Log.Information("2")},
{ x => x == 3, () => Log.Information("3")},
{ x => x == 4, () => Log.Information("4")},
{ x => x == 5, () => Log.Information("5")},
};
int numberToCheck = 1;
//Used like this
actionSwitch.FirstOrDefault(sw => sw.Key(numberToCheck)).Value();
Log.Information( "x")がどこにあるのかを実行したいものを交換するだけで、 "switch"ステートメントが得られます。
Funcによって「見つかった」キーをチェックする場合、エラー処理が必要になります。
スイッチのFuncバージョンをご覧になりたい場合は、 スイッチの例の章があるブログ投稿 を作成しました。
VBのようにスイッチで比較を使用することはできません。ここには2つのオプションがあり、スイッチオンする値を既知の値に置き換えて使用します。
switch(num)
{
case 4:
// some code ;
break;
case 3:
// some code ;
break;
case 0:
// some code ;
break;
default:
// some code ;
break;
}
これは、あなたが要求したものとまったく同じではないことに注意してください。0,3,4以外の値はすべてdeafult:句になります。
私は最近、次のパターンに遭遇しました、そしてそれを嫌う間、私はそれが実用的でないと主張することはできません:
switch(0)
{
case 0 when x < 0:
...
break;
case 0 when a > 5 && x == 0:
...
break;
}
ダミー式((0)
、およびcase 0
)は絶対にひどいもので、イディオムになるのは嫌だと思いますが、ちょっと-簡潔で非常に明確です。確かに、意味を完全に覆い隠し、不可解な知識を必要とするのは、いくつかのハックではありません。しかし、C#はその必要性を取り除くのに役立ちます。以下を合法的にしたい:
switch // maybe () here, if the grammar would demand
{
case when x < 0: // I like the case to stay
...
case when a > 5 && x == 0:
...
}