57

我在 case 表达式中使用了Or语句。

即使我在此范围内有一个值,它也没有找到匹配项。为什么不?

示例代码

Select Case 2
    Case 0
        ' Some logic

    Case 1
        ' Some other logic

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

 End Select

有了上面的内容,我会假设hit会被打印出来,但事实并非如此。

4

6 回答 6

100

使用逗号运算符分隔 case 语句

Select Case 2
    Case 0,1,2,3
        Console.WriteLine("hit")
 End Select
于 2009-02-17T01:03:43.983 回答
24

正如Jared所说,您需要使用逗号运算符来分隔 case 语句。

你正在做的Or是一个按位或,导致它是“3”。有趣的是,“2 AND 3”可能适用于您的具体情况。

于 2009-02-17T01:14:18.140 回答
21

JaredPar 是对的,但您也可以使用 To 构造

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

这将是 0 或 1 什么都不做,2 或 3 打印 Hit...To 构造是一个范围...

这是 MSDN

于 2009-02-17T01:08:53.113 回答
10

编辑: 假设 VB.NET 不允许大小写 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# 中的 switch)时,它会尝试使用查找表和switch MSIL 指令来编译它们,但在你有类似情况 1、2、11、55的情况下,编译器将无法转换到一个查找表,它必须使用一系列比较(这就像使用 If.. Else)。

关键是,为了真正利用 Select 语句,在设计案例时应该考虑到这一点。否则,唯一的好处是代码可读性。

设计良好的开关是 O(1) 操作,而设计不佳的开关(相当于一系列 If..Then..Else 语句)是 O(n) 操作。

于 2009-02-17T01:01:54.690 回答
3

这将允许您在 0 的情况下执行“something”,在 1 的情况下执行“something else”,在 2 或 3 的情况下执行“hit”或“hit else”。

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
于 2009-02-17T00:59:45.147 回答
0

大多数或所有这些答案都忽略了失败(或 Goto Case)的目的:

不必重用代码或只为同一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;

在简单的情况下,case 比比较 if-branch 更容易读写,但 fall-through 是最好的部分。

至少在 Visual Basic 2017 中现在有一种方法可以使用。虽然它不是最漂亮的。

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
于 2021-07-21T18:41:02.723 回答