私は、case式で Or ステートメントを使用しています。
この範囲内の値がありますが、一致するものが見つかりませんでした。何故なの?
サンプルコード:
Select Case 2
Case 0
' Some logic
Case 1
' Some other logic
Case 2 Or 3
Console.WriteLine("hit")
End Select
上記では、hit
が出力されると仮定しますが、そうではありません。
コンマ演算子を使用して、caseステートメントを区切ります
Select Case 2
Case 0,1,2,3
Console.WriteLine("hit")
End Select
Jaredのように、caseステートメントを区切るにはコンマ演算子を使用する必要があります。
行っていたOr
はビット単位のORであり、結果として「3」になります。おもしろいことに、「2 AND 3」はおそらくあなたの特定のケースでうまくいったでしょう。
JaredParには適切ですが、To構文を使用することもできます
Select Case 2
Case 0,1
Case 2 To 3
Console.WriteLine("Hit")
End Select
これは0または1で、何もせず、2または3で印刷されます... To構成は範囲です...
編集: 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)操作。
これにより、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