web-dev-qa-db-ja.com

C#のSwitchステートメントで式を評価する

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を評価させることは可能ですか?そうでない場合、どうすればそれができますか?

43
priyanka.sarkar

できません-switch/caseは個々の値専用です。条件を指定する場合は、「if」が必要です。

if (num < 0)
{
    ...
}
else
{
    switch(num)
    {
        case 0: // Code
        case 1: // Code
        case 2: // Code
        ...
    }
}
70
Jon Skeet

このトピックはかなり古いことを知っていますが、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;
}
38
Max

Switchステートメントの最後に次のようなことを行うことができます。

default:
    if(num < 0)
    {
        ... // Code
    }
    break;
13
tbreffni

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などの他の「存在しない」番号を使用します。

8
queen3

必要かどうかにかかわらず、使用する必要があります。スイッチは、値を定数値と比較することのみが可能です。

5

私が考えることができる唯一の方法(そして私は本当にそれをお勧めしません)、次のようになります:

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;
}
5
Oliver Hanappi

あなたはこれを行うことができます

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;
        }
5
Cat_img.jpeg

他の方法も可能です(ジョンスキートの答えに関連):

switch(num)
{
  case a:
      break;
  default:
      if( num < 0 )
      {}
   break;
}
4
StampedeXV

できることは、このようなデリゲートを使用することです。

        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バージョンをご覧になりたい場合は、 スイッチの例の章があるブログ投稿 を作成しました。

3
Sturla

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:句になります。

1
rsp

私は最近、次のパターンに遭遇しました、そしてそれを嫌う間、私はそれが実用的でないと主張することはできません:

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:
    ...
}
0
Kuba Ober