在单个 case 语句中使用多个条件

Posted

技术标签:

【中文标题】在单个 case 语句中使用多个条件【英文标题】:Using multiple conditions within a single case statement 【发布时间】:2017-03-06 09:49:27 【问题描述】:

我有 5 个数字,想测试其中 3 个是否相同,所以我写了这个:

Select Case Reel1Num
Case (Reel2Num And Reel3Num) Or (Reel2Num And Reel4Num) Or (Reel2Num And Reel5Num) Or (Reel3Num And Reel4Num) Or (Reel3Num And Reel5Num) Or (Reel4Num And Reel5NUm)
    ThreeNums = +1
    lbl3OfSame.Text = "Three Of Same: " & ThreeNums
End Select

但它似乎没有返回我想要的结果。我知道我可以使用类似的东西:

If (Reel1NUm = Reel2Num And Reel1Num = Reel3Num) Or...   Then
    ThreeNums = +1
    lbl3OfSame.Text = "Three Of Same: " & ThreeNums
End If

但是对于我想要比较的数量,这似乎比我觉得我需要做的要多得多。

有没有更简单的方法来做到这一点?

【问题讨论】:

您在顶部以布尔方式“比较”,即 reel2=true & reel3=true,您可以使用类似 ((r2-r3) * (r2-r4) * (r2- r5))=0 或许 ^^ 没用。还是谢谢 它们绝对是数字吗?如果 r2,r3,r4 为 3,r5 为 2,那么 r2-r3=0, r2-r4=0 and r2-r5=1, and 0*0*1=0 ? 【参考方案1】:

正如其他评论者所指出的,数字的“布尔”比较可能没有按照您的想法进行。您需要将每个案例的 reel 值与所有其他 reel 值进行比较,这不会使语法比您的 If 结构短得多。有多种数学解决方案(如果您的数据良好,Nathan_Sav 提出的解决方案应该可行)。

但是,您问是否有更好的方法,并且为了保持代码简单,一种方法是将卷轴值分配给结果数组或某种集合。

一个明显的集合是Dictionary,它可以包含每个唯一卷轴值的频率计数和数量。如果您已将 ReelNum 声明为数组,那么代码将非常短,但保留您的各个变量,您需要您的主要 Sub 和另一个来构建字典。所以你的主要 Sub 将是:

    Dim count As Dictionary(Of Integer, Integer)
    count = New Dictionary(Of Integer, Integer)()

    BuildResults(count, ReelNum1)
    BuildResults(count, ReelNum2)
    BuildResults(count, ReelNum3)
    BuildResults(count, ReelNum4)
    BuildResults(count, ReelNum5)

    Select Case count.Values.Max()
        Case 1 : Console.Write("None the same")
        Case 2 : Console.Write("Two the same")
        Case 3 : Console.Write("Three the same")
        Case 4 : Console.Write("Four the same")
        Case 5 : Console.Write("All the same")
        Case Else : Console.Write("Who knows?")
    End Select

以及构建例程:

Private Sub BuildResults(ByRef count As Dictionary(Of Integer, Integer), ByVal newNum As Integer)
    If Not count.ContainsKey(newNum) Then count.Add(newNum, 0)
    count(newNum) = count(newNum) + 1
End Sub

我不确定这是否是一个教育项目,但以防万一,我提供了一个 Select Case,以便您了解它是如何工作的。

【讨论】:

谢谢,这正是我想要的。现在阅读字典的作用!谢谢! 很高兴为您提供帮助。查看所有答案,如果您的问题得到解决,请通过“接受”其中一个答案将您的帖子从未回答列表中删除。【参考方案2】:

您可以按数字分组,找出出现 3 次的数字:

Sub Main
    Dim numbers = New List(Of Integer) From 1,2,3,2,4,5,3,6,2,4,7
    Dim numbersAppearingThreeTimes = numbers.GroupBy(Function(i) i) _
                                            .Where(Function(g) g.Count() = 3)

    For Each g In numbersAppearingThreeTimes
        Console.WriteLine(g.Key)
    Next
End Sub

结果:

2

【讨论】:

以上是关于在单个 case 语句中使用多个条件的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同条件的sql server的case语句中插入多个else?

条件语句

SQL 中 where 条件中 in 后面 加 CASE WHEN 语句 报错

case 语句中的多个条件重复表中的行

Verilog语法中case语句是否只执行一条语句

pgsql使用case条件都不满足怎么去原值