Ответ 1
Используйте оператор запятой для разграничения операторов case
Select Case 2
Case 0,1,2,3
Console.WriteLine("hit")
End Select
Я использую или в выражении case.
Несмотря на то, что у меня есть значение в этом диапазоне, он не нашел соответствия. Почему бы и нет?
Пример кода:
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
Как сказал Джаред, вам нужно использовать оператор запятой для разграничения операторов case.
Or
, который вы делали, является поразрядным ИЛИ, в результате чего он равен "3". Как бы забавно, "2 И 3", вероятно, работали бы в вашем конкретном случае.
JaredPar имеет это право, но вы также можете использовать конструкцию
Select Case 2
Case 0,1
Case 2 To 3
Console.WriteLine("Hit")
End Select
Это будет 0 или 1 ничего не делать, 2 или 3 печати Хит... Для построения является диапазон...
Изменить: Похоже, я ошибался, полагая, что VB.NET не разрешает Case ORing. Я думал в С# и 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 (switch на С#), он попытается скомпилировать их с помощью таблиц поиска и команды MSIL switch, но в случае, если у вас есть что-то вроде Case 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