我在我的案例表达中使用Or语句。
即使我有一个在此范围内的值,但它找不到匹配项。为什么不呢?
示例代码:
Select Case 2
Case 0
' Some logic
Case 1
' Some other logic
Case 2 Or 3
Console.WriteLine("hit")
End Select
有了上述内容,我会假设会打印hit
,但情况并非如此。
答案 0 :(得分:93)
使用逗号运算符分隔案例陈述
Select Case 2
Case 0,1,2,3
Console.WriteLine("hit")
End Select
答案 1 :(得分:24)
正如 Jared 所说,你需要使用逗号运算符来分隔case语句。
你正在做的Or
是一个按位OR,导致它为“3”。有趣的是,“2和3”可能适用于您的具体情况。
答案 2 :(得分:20)
JaredPar没错,但您也可以使用To构建
Select Case 2
Case 0,1
Case 2 To 3
Console.WriteLine("Hit")
End Select
这将是0或1什么都不做,2或3打印命中... To构造是一个范围...
答案 3 :(得分:10)
编辑:假设我认为VB.NET不允许Case ORing,我认为错了。我在用C#和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语句(在C#中切换)时,它将尝试使用查找表和 开关 MSIL指令编译它们,但是在你有类似案例1,2,11,55 编译器将无法将其转换为查找表,并且必须使用一系列比较(这类似于使用If .. Else)。
关键是,为了真正利用Select语句,案例的设计应考虑到这一点。否则,唯一的好处是代码可读性。
设计良好的开关是O(1)操作,而设计不良的开关(相当于一系列If..Then..Else语句)是O(n)操作。
答案 4 :(得分: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
答案 5 :(得分:0)
不必为同一个 Select Case
/If Tree
中的几个区域重复使用代码或创建特殊函数,这样您就可以避免重复使用代码,例如这个 Javascript。
这些示例非常人为。肯定有方法可以简化这种情况,但很多时候都没有。
let pay = 100, perks = '';
Switch (EmpObj.type) {
Case 'Boss':
pay = pay * 10;
perks = '11 month vacation per year';
Case 'Manager':
pay = pay * 3; // This will make Boss pay * 30
Case 'Employee':
EmpObj.pay = pay;
EmpObj.perks = perks;
break;
Case 'Intern':
EmpObj.sendMessage("Go get some coffee.")
}
在 VB.net 中,相同的代码是
dim pay = 100, perks = "";
Switch (EmpObj.type) {
Case "Boss":
pay = pay * 30
perks = "11 month vacation per year"
Case "Manager":
pay = pay * 3
Case "Employee":
Case 'Intern':
pay = 0
EmpObj.sendMessage("Go get some coffee.")
End Select
EmpObj.pay = pay;
EmpObj.perks = perks;
在简单情况下,案例比比较的 if 分支更容易读写,但失败是最好的部分。
GoTo Case "[label]"
和 Goto [Case-label]
仍然不起作用。
标签(此处为 Number2
)必须在 Case
之后。这是最令人失望的部分。
dim Value = "1"
Select Case Value
Case "0"
' do nothing, example
Case "1"
MsgBox("one")
GoTo Number2
Case "2"
Number2:
MsgBox("two")
Case "boolean"
MsgBox("three")
' just to show it won't fall through
End Select