web-dev-qa-db-ja.com

ケースOR-ingを使用したVB.NETのselect caseステートメントロジックとは何ですか?

私は、case式で Or ステートメントを使用しています。

この範囲内の値がありますが、一致するものが見つかりませんでした。何故なの?

サンプルコード

Select Case 2
    Case 0
        ' Some logic

    Case 1
        ' Some other logic

    Case 2 Or 3
        Console.WriteLine("hit")

 End Select

上記では、hitが出力されると仮定しますが、そうではありません。

53
Llyle

コンマ演算子を使用して、caseステートメントを区切ります

Select Case 2
    Case 0,1,2,3
        Console.WriteLine("hit")
 End Select
96
JaredPar

Jaredのように、caseステートメントを区切るにはコンマ演算子を使用する必要があります。

行っていたOrはビット単位のORであり、結果として「3」になります。おもしろいことに、「2 AND 3」はおそらくあなたの特定のケースでうまくいったでしょう。

24
John T

JaredParには適切ですが、To構文を使用することもできます

Select Case 2
    Case 0,1
    Case 2 To 3
        Console.WriteLine("Hit")
End Select

これは0または1で、何もせず、2または3で印刷されます... To構成は範囲です...

これがMSDNです

20
Jason Punyon

編集: VB.NETがCase ORingを許可しないと仮定するのは間違っていたようです。私はC#とILで考えていましたが、間違っていたようです。

ただし、誰かが指摘したように、コードが機能しなかった理由は、ケース2または3が2または3をビット単位で評価したため、ケース3に評価されたためです。

明確にするために:


       2 binary = 0000 0010
       3 binary = 0000 0011
  2 Or 3 binary = 0000 0011 (= 3)

  Select Case 2
     Case 0            '--> no match

     Case 1            '--> no match

     Case 2 Or 3       '(equivalent to Case 3  --> no match)
   End Select

ただし、パフォーマンスのために、そのような構造を使用しないでください。コンパイラがSelectステートメント(C#のスイッチ)を検出すると、ルックアップテーブルとswitch MSIL命令を使用してコンパイルしようとします。しかし、ケース1,2,11,55のようなものがある場合、コンパイラはそれをルックアップテーブルに変換することができず、一連の比較を使用する必要があります(If .. Elseを使用するようなものです)。

重要なのは、Selectステートメントを実際に活用するには、それを念頭に置いてケースを設計する必要があるということです。それ以外の場合、唯一の利点はコードの可読性です。

適切に設計されたスイッチはO(1)操作です。一方、不十分に設計されたスイッチ(一連のIf..Then..Elseステートメントに相当)はO(n)操作。

10
user67143

これにより、0の場合は「何か」、1の場合は「その他」、2または3の場合は「ヒット」、それ以外の場合は「ヒット」を実行できます。

Select Case 2
    Case 0
        Console.WriteLine("something")
    Case 1
        Console.WriteLine("something else")
    Case Is 2 To 3
        Console.WriteLine("hit")
    Else
        Console.WriteLine("hit else")
 End Select
3
achinda99