Ich verwende eine oder -Anweisung in meinem case-Ausdruck.
Obwohl ich einen Wert innerhalb dieses Bereichs habe, wurde keine Übereinstimmung gefunden. Warum nicht?
Beispielcode :
Select Case 2
Case 0
' Some logic
Case 1
' Some other logic
Case 2 Or 3
Console.WriteLine("hit")
End Select
Mit den obigen würde ich annehmen, dass hit
gedruckt würde, aber das ist nicht der Fall.
Verwenden Sie den Komma-Operator, um case-Anweisungen abzugrenzen
Select Case 2
Case 0,1,2,3
Console.WriteLine("hit")
End Select
Wie Jared sagte, müssen Sie den Komma-Operator verwenden, um case-Anweisungen abzugrenzen.
Das Or
, das Sie gemacht haben, ist ein bitweises ODER, was dazu führt, dass es "3" ist. Amüsanterweise hätte "2 AND 3" wahrscheinlich für Ihren speziellen Fall funktioniert.
JaredPar hat es richtig, aber Sie können auch das To-Konstrukt verwenden
Select Case 2
Case 0,1
Case 2 To 3
Console.WriteLine("Hit")
End Select
Dies wäre 0 oder 1 nichts zu tun, 2 oder 3 drucken Hit ... Das To-Konstrukt ist ein Bereich ...
Edit: Anscheinend habe ich falsch angenommen, dass VB.NET keine Groß-/Kleinschreibung zulässt. Ich habe in C # und IL nachgedacht und es scheint, dass ich mich geirrt habe.
Wie jedoch jemand darauf hingewiesen hat, war der Grund, warum Ihr Code nicht funktionierte, der, dass Fall 2 oder 3 2 oder 3 als bitweise oder und daher als Fall 3 ausgewertet wurde.
Zur Klarstellung:
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
Ich bin jedoch der Meinung, dass ich darauf hinweisen sollte, dass man solche Konstrukte aus Gründen der Leistung nicht verwenden sollte. Wenn der Compiler auf Select-Anweisungen stößt (in C # umschalten), wird versucht, diese mithilfe von Nachschlagetabellen und der Anweisung switch MSIL zu kompilieren aber in dem Fall, wo Sie etwas wie Fall 1,2,11,55 haben, wird der Compiler nicht in der Lage sein, das in eine Nachschlagetabelle umzuwandeln und es muss eine Reihe von Vergleichen verwenden (ähnlich wie bei If .. Else).
Der Punkt ist, dass, um die Select-Anweisung wirklich auszunutzen, die Fälle unter Berücksichtigung dessen entworfen werden sollten. Ansonsten ist der einzige Vorteil die Lesbarkeit des Codes.
Ein gut gestalteter Schalter ist eine O(1) - Operation, während ein schlecht gestalteter (der einer Reihe von If..Then..Else-Anweisungen entspricht) ein O(n) Operation.
Auf diese Weise können Sie "etwas" bei 0 ausführen, "etwas anderes" bei 1, "schlagen" bei 2 oder 3 oder "schlagen sonst".
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