在单个 case 语句中使用多个条件
Using multiple conditions within a single case statement
我有 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
但是好像return不是我想要的结果。我知道我可以使用类似的东西:
If (Reel1NUm = Reel2Num And Reel1Num = Reel3Num) Or... Then
ThreeNums = +1
lbl3OfSame.Text = "Three Of Same: " & ThreeNums
End If
但是对于我想要比较的数量,这似乎比我觉得需要做的要多得多。
有更简单的方法吗?
正如其他评论者所指出的,'boolean' 数字比较可能与您认为的不符。您将需要每个案例将其卷轴值与所有其他卷轴值进行比较,这不会使语法比您的 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
以便您了解它是如何工作的。
您可以按数字分组,找出哪些出现了 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
我有 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
但是好像return不是我想要的结果。我知道我可以使用类似的东西:
If (Reel1NUm = Reel2Num And Reel1Num = Reel3Num) Or... Then
ThreeNums = +1
lbl3OfSame.Text = "Three Of Same: " & ThreeNums
End If
但是对于我想要比较的数量,这似乎比我觉得需要做的要多得多。
有更简单的方法吗?
正如其他评论者所指出的,'boolean' 数字比较可能与您认为的不符。您将需要每个案例将其卷轴值与所有其他卷轴值进行比较,这不会使语法比您的 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
以便您了解它是如何工作的。
您可以按数字分组,找出哪些出现了 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