2009-02-17 10 views
52

Sto usando un'istruzione Or nell'espressione del mio caso.Che cos'è la logica dell'istruzione case select VB.NET con il caso OR-ing?

Anche se ho un valore compreso in questo intervallo, non ha trovato una corrispondenza. Perchè no?

Esempio Codice:

Select Case 2 
    Case 0 
     ' Some logic 

    Case 1 
     ' Some other logic 

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

End Select 

Con quanto sopra presumo che hit sarebbe da stampare, ma non è questo il caso.

risposta

87

utilizza l'operatore virgola per delimitare casi di dichiarazioni

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

il mio intento non è per il caso 0 e 1 per sfumare. Ma la virgola è ciò che cercavo. – Llyle

+0

@downvoter, cura di spiegare? – JaredPar

+3

-1, perché non risponde alla domanda come indicato. Offre piuttosto una soluzione alternativa a quella tentata dall'interrogante. La domanda è: in che modo VB interpreta l'operatore OR in un'istruzione Select? Altrimenti, la domanda deve essere modificata per corrispondere alla risposta. Ma non lo suggerirei perché @JohnT ha dato la risposta corretta. – systemovich

3

Ciò consentirà di eseguire "qualcosa" nel caso di 0, "qualcos'altro" nel caso di 1, "hit" nel caso di 2 o 3 o "hit else" altrimenti.

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 
9

Edit: Sembra che mi sbagliavo nel ritenere che VB.NET non consente Caso ORing. Stavo pensando in C# e in IL e sembra che mi sbagliavo.

Tuttavia, come qualcuno ha sottolineato, il motivo per il codice non ha funzionato perché è stato il caso di 2 o 3 stava valutando 2 o 3 come un OR bit a bit e, quindi, la valutazione per Caso 3.

Per chiarimenti:


     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 

Tuttavia, sento che vorrei sottolineare che per il bene di prestazioni, non si dovrebbe utilizzare tali costrutti. Quando il compilatore incontra le istruzioni Select (passa in C#) proverà a compilarle usando le tabelle di ricerca e lo switch MSIL ma nel caso in cui si abbia qualcosa come Caso 1,2,11,55 il compilatore non sarà in grado di convertirlo in una tabella di ricerca e dovrà usare una serie di confronti (che è come usare If .. Else).

Il punto è che al fine di sfruttare realmente l'istruzione Select, i casi devono essere progettati pensando a questo. In caso contrario, l'unico vantaggio è la leggibilità del codice.

Un interruttore ben progettato è un'operazione O (1) mentre uno mal progettato (che è equivalente a una serie di istruzioni If..Then..Else) è un'operazione O (n).

+0

Grazie, questo permette alla mia mente di riposare ora. Leggere il codice logicamente non mi dava alcun indizio sul fatto che stavo facendo qualcosa di sbagliato. – Llyle

+0

Sono contento che tu sia riuscito a trovare la risposta al problema che stavi cercando di risolvere e spero che i chiarimenti che ho aggiunto alla mia risposta ti aiuteranno a creare meglio le istruzioni Select :) – user67143

19

JaredPar ha ragione, ma si può anche utilizzare il Per costruire

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

Questo sarebbe 0 o 1 non fanno nulla, 2 o 3 Hit stampa ... L'Per costruire è una gamma ...

Here's the MSDN

+0

Vero, e stavo usando la parola chiave To, ma è leggermente hacky perché se diciamo 2 e 3 fossero Enum vals e l'enum viene rifattorizzato senza tener conto di questo uso - che se è in qualche classe nelle profondità di un grande sistema - allora hai delle pause inaspettate;) – Llyle

23

As Jared ha dichiarato che è necessario utilizzare l'operatore virgola per delimitare le istruzioni case.

Il Or che stavi facendo è un OR bit a bit, risultante in "3". In modo divertente, "2 AND 3" avrebbe probabilmente funzionato per il tuo caso specifico.

Problemi correlati