57

ケース式でOrステートメントを使用しています。

この範囲内に値がありますが、一致するものは見つかりませんでした。なぜだめですか?

コード例:

Select Case 2
    Case 0
        ' Some logic

    Case 1
        ' Some other logic

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

 End Select

hit上記の場合、印刷されると思いますが、そうではありません。

4

6 に答える 6

100

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

Select Case 2
    Case 0,1,2,3
        Console.WriteLine("hit")
 End Select
于 2009-02-17T01:03:43.983 に答える
24

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

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

于 2009-02-17T01:14:18.140 に答える
21

JaredPar は正しいですが、To コンストラクトを使用することもできます

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

これは 0 または 1 何もしない、2 または 3 印刷ヒット...To 構造は範囲です...

ここにMSDNがあります

于 2009-02-17T01:08:53.113 に答える
10

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

ただし、誰かが指摘したように、コードが機能しなかった理由は、Case 2 Or 3 が 2 Or 3 をビット単位の or として評価していたため、Case 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) に遭遇すると、ルックアップ テーブルとswitch MSIL 命令を使用してそれらをコンパイルしようとしますが、 Case 1,2,11,55のようなものがある場合、コンパイラは変換できません。それをルックアップ テーブルに変換すると、一連の比較を使用する必要があります (これは、If.. Else を使用するようなものです)。

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

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

于 2009-02-17T01:01:54.690 に答える
3

これにより、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
于 2009-02-17T00:59:45.147 に答える