2017-03-06 4 views
0

Ich habe 5 Zahlen und wollen verwenden testen, ob drei von ihnen identisch sind, so schrieb ich folgendes:mehrere Bedingungen innerhalb einer Case-Anweisung

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 

Aber es schien nicht das Ergebnis, das ich wollte zurückzukehren. Ich weiß, dass ich so etwas wie verwenden:

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

Aber das scheint wie viel mehr schreiben, als ich fühle mich für die Menge tun müssen, die ich vergleichen will.

Gibt es eine einfachere Möglichkeit, dies zu tun?

+0

Du "Vergleich" in der Booleschen Weg nach oben top, dh reel2 = true & reel3 = true, Du könntest sowas benutzen wie ((r2-r3) * (r2-r4) * (r2-r5)) = 0 vielleicht –

+0

^^ Hat nicht funktioniert. danke trotzdem –

+0

sind sie definitiv nummern? wenn r2, r3, r4 3 waren und r5 2 war, dann r2-r3 = 0, r2-r4 = 0 und r2-r5 = 1 und 0 * 0 * 1 = 0? –

Antwort

0

Wie andere Kommentatoren angegeben haben, macht der 'boolesche' Zahlenvergleich wahrscheinlich nicht das, was er zu tun scheint. Sie würden jeden Fall benötigen, um seinen Spulenwert mit allen anderen Spulenwerten zu vergleichen, was die Syntax nicht viel kürzer machen würde als Ihre If Struktur. Es gibt verschiedene mathematische Lösungen (und die von Nathan_Sav vorgeschlagene sollte funktionieren, wenn Ihre Daten gut sind).

Sie haben jedoch gefragt, ob es einen besseren Weg gibt und, um den Code einfach zu halten, wäre es eine Möglichkeit, die Spulenwerte einem Ergebnis-Array oder einer Sammlung einer Art zuzuordnen.

Eine naheliegende Sammlung wäre eine Dictionary, die die Häufigkeitszählung und die Anzahl jedes einzelnen Spulenwerts enthalten könnte. Wenn Sie Ihre ReelNum als ein Array deklariert hätten, wäre der Code sehr kurz, aber wenn Sie Ihre individuellen Variablen behalten, brauchen Sie Ihre Haupt- und eine andere, um das Dictionary zu erstellen. Also Ihr Hauptunter wäre:

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 

Und das Gebäude Routine:

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 

Ich bin mir nicht sicher, ob dies ein Bildungsprojekt, aber nur für den Fall es ist, ich habe eine inbegriffen Select Case so können Sie sehen, wie es funktioniert.

+0

Danke, das hat genau das gemacht, was ich wollte. Jetzt, um zu lesen, was ein Wörterbuch tut! Vielen Dank! –

+0

Froh, zu helfen. Werfen Sie einen Blick auf alle Antworten und wenn Ihr Problem gelöst ist, dann nehmen Sie bitte Ihren Beitrag von der unbeantworteten Liste, indem Sie eine der Antworten akzeptieren. – Ambie

0

Sie können Gruppe durch die Zahlen und finden Sie heraus, welche erscheinen dreimal:

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 

Ergebnis: