web-dev-qa-db-fra.com

Quelle est la logique d'instruction de sélection de cas VB.NET avec OR-case?

J'utilise une instruction Or dans mon expression de cas.

Même si j'ai une valeur dans cette plage, il n'a pas trouvé de correspondance. Pourquoi pas?

Exemple de code :

Select Case 2
    Case 0
        ' Some logic

    Case 1
        ' Some other logic

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

 End Select

Avec ce qui précède, je suppose que hit serait imprimé, mais ce n'est pas le cas.

53
Llyle

Utilisez l'opérateur virgule pour délimiter les instructions de casse

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

Comme Jared l'a dit, vous devez utiliser l'opérateur virgule pour délimiter les déclarations de casse.

Le Or que vous faisiez est un OU au niveau du bit, ce qui en fait "3". De manière amusante, "2 ET 3" aurait probablement fonctionné pour votre cas spécifique.

24
John T

JaredPar a raison, mais vous pouvez également utiliser la construction To

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

Ce serait 0 ou 1 ne rien faire, 2 ou 3 Imprimer Hit ... La construction To est une plage ...

Voici le MSDN

20
Jason Punyon

Edit: Il semble que j'ai eu tort de supposer que VB.NET n'autorise pas l'OR de casse. Je pensais en C # et IL et il semble que j'avais tort.

Cependant, comme quelqu'un l'a souligné, la raison pour laquelle votre code n'a pas fonctionné était que le cas 2 ou 3 évaluait 2 ou 3 au niveau du bit ou et donc évaluait le cas 3.

Pour clarification:


       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

Cependant, je pense que je dois souligner que, pour des raisons de performance, il ne faut pas utiliser de telles constructions. Lorsque le compilateur rencontre des instructions Select (commutateur en C #), il essaie de les compiler en utilisant des tables de recherche et le commutateur MSIL mais dans le cas où vous avez quelque chose comme Cas 1,2,11,55 le compilateur ne sera pas en mesure de convertir cela en une table de recherche et devra utiliser une série de comparaisons (ce qui revient à utiliser If .. Else).

Le fait est que pour vraiment profiter de l'instruction Select, les cas doivent être conçus dans cet esprit. Sinon, le seul avantage est la lisibilité du code.

Un commutateur bien conçu est une opération O(1)) alors qu'un commutateur mal conçu (qui équivaut à une série d'instructions If..Then..Else) est un O(n).

10
user67143

Cela vous permettra d'effectuer "quelque chose" dans le cas de 0, "autre chose" dans le cas de 1, "hit" dans le cas de 2 ou 3 ou "hit else" sinon.

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