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

时间:2017-03-06 09:49:28

标签: vb.net select-case

我有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

但这似乎比我觉得我需要做的更多的写作方式需要比较。

有更简单的方法吗?

2 个答案:

答案 0 :(得分:0)

正如其他评论者所指出的那样,'布尔'数字的比较可能并不是你认为它做的事情。您需要将每个案例的卷轴值与所有其他卷轴值进行比较,这些卷轴值不会使语法比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,这样你就可以看到它是如何运作的。

答案 1 :(得分:0)

您可以按数字分组,找出哪些出现三次:

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