2017-01-13 4 views
0

Hier ist mein CodeEntfernen Werte aus einer Sammlung

Public Class FrmGameBoard 



Const NumValues As Integer = 26 
Dim Values(NumValues) As Decimal 
Dim ValueCollection = New Collection 
Dim i As Integer = 0 
Dim Briefcases = New Collection 
Dim RemainingBriefcases = New Collection 
Dim GlobalAction As Integer = 0 
Dim turn As Integer = 0 
Dim name As String 
Dim numberofremainingvalues, sumofremainingvalues As Integer 
Dim MyValue, EVBig, EVSmall As Double 
Dim n As Integer = 0 
Function longif() 

    If MyValue = 0.01 Then 
     Lbl1p.Visible = False 
     RemainingBriefcases.Remove(0) 
    ElseIf MyValue = 0.02 Then 
     Lbl2p.Visible = False 
     RemainingBriefcases.Remove(1) 
    ElseIf MyValue = 0.05 Then 
     Lbl5p.Visible = False 
     RemainingBriefcases.Remove(2) 
    ElseIf MyValue = 0.1 Then 
     Lbl10p.Visible = False 
     RemainingBriefcases.Remove(3) 
    ElseIf MyValue = 0.25 Then 
     Lbl25p.Visible = False 
     RemainingBriefcases.Remove(4) 
    ElseIf MyValue = 0.5 Then 
     Lbl50p.Visible = False 
     RemainingBriefcases.Remove(5) 
    ElseIf MyValue = 0.75 Then 
     Lbl75p.Visible = False 
     RemainingBriefcases.Remove(6) 
    ElseIf MyValue = 1.0 Then 
     Lbl1d.Visible = False 
     RemainingBriefcases.Remove(7) 
    ElseIf MyValue = 2.5 Then 
     Lbl2d50p.Visible = False 
     RemainingBriefcases.Remove(8) 
    ElseIf MyValue = 5.0 Then 
     Lbl5d.Visible = False 
     RemainingBriefcases.Remove(9) 
    ElseIf MyValue = 10.0 Then 
     Lbl10d.Visible = False 
     RemainingBriefcases.Remove(10) 
    ElseIf MyValue = 25.0 Then 
     Lbl25d.Visible = False 
     RemainingBriefcases.Remove(11) 
    ElseIf MyValue = 50.0 Then 
     Lbl50d.Visible = False 
     RemainingBriefcases.Remove(12) 
    ElseIf MyValue = 100.0 Then 
     Lbl100d.Visible = False 
     RemainingBriefcases.Remove(13) 
    ElseIf MyValue = 500.0 Then 
     Lbl500d.Visible = False 
     RemainingBriefcases.Remove(14) 
    ElseIf MyValue = 1000.0 Then 
     Lbl1000d.Visible = False 
     RemainingBriefcases.Remove(15) 
    ElseIf MyValue = 5000.0 Then 
     Lbl5000d.Visible = False 
     RemainingBriefcases.Remove(16) 
    ElseIf MyValue = 10000.0 Then 
     Lbl10000d.Visible = False 
     RemainingBriefcases.Remove(17) 
    ElseIf MyValue = 50000.0 Then 
     Lbl50000d.Visible = False 
     RemainingBriefcases.Remove(18) 
    ElseIf MyValue = 100000.0 Then 
     Lbl100000d.Visible = False 
     RemainingBriefcases.Remove(19) 
    ElseIf MyValue = 250000.0 Then 
     Lbl250000d.Visible = False 
     RemainingBriefcases.Remove(20) 
    ElseIf MyValue = 500000.0 Then 
     Lbl500000d.Visible = False 
     RemainingBriefcases.Remove(21) 
    ElseIf MyValue = 750000.0 Then 
     Lbl750000d.Visible = False 
     RemainingBriefcases.Remove(22) 
    ElseIf MyValue = 1000000 Then 
     Lbl1000000d.Visible = False 
     RemainingBriefcases.Remove(23) 
    ElseIf MyValue = 1250000.0 Then 
     Lbl1250000d.Visible = False 
     RemainingBriefcases.Remove(24) 
    ElseIf MyValue = 1500000.0 Then 
     Lbl1500000.Visible = False 
     RemainingBriefcases.Remove(25) 
    End If 
    turn = turn + 1 
    LblTurnNumber.Text = CStr(turn) 



End Function 





Private Sub FrmGameBoard_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim X As Integer 
    Dim n As Integer = 1 


    Dim MyRandom As New Random() 
    Values(0) = 0.01 
    Values(1) = 0.02 
    Values(2) = 0.05 
    Values(3) = 0.1 
    Values(4) = 0.25 
    Values(5) = 0.5 
    Values(6) = 0.75 
    Values(7) = 1.0 
    Values(8) = 2.5 
    Values(9) = 5.0 
    Values(10) = 10.0 
    Values(11) = 25.0 
    Values(12) = 50.0 
    Values(13) = 100.0 
    Values(14) = 500.0 
    Values(15) = 1000.0 
    Values(16) = 5000.0 
    Values(17) = 10000.0 
    Values(18) = 50000.0 
    Values(19) = 100000.0 
    Values(20) = 250000.0 
    Values(21) = 500000.0 
    Values(22) = 750000.0 
    Values(23) = 1000000.0 
    Values(24) = 1250000.0 
    Values(25) = 1500000.0 



    name = InputBox("Please enter your name below.") 
    LblWelcome.Text = "Welcome " & name 
    Do While i <= NumValues 
     ValueCollection.Add(Values(i)) 
     RemainingBriefcases.Add(Values(i)) 
     i = i + 1 
    Loop 
    i = 1 
    For n = 1 To NumValues 
     X = MyRandom.Next(1, ValueCollection.Count) 
     Briefcases.Add(ValueCollection(X)) 
     ValueCollection.Remove(X) 
    Next 
    n = 1 
    i = 1 


End Sub 

Private Sub Lbl1_Click(sender As Object, e As EventArgs) Handles Lbl1.Click 
    Const MyNumber As Integer = 1 
    Lbl1.Visible = False 
    Pic1.Visible = False 
    MyValue = Briefcases(MyNumber) 
    Dim action As Integer = 0 
    If GlobalAction = 0 Then 
     LblMyBriefcase.Text = CStr(MyNumber) 
     action = 1 
     GlobalAction = 1 
    End If 

    If action = 0 Then 
     longif() 
    End If 
End Sub 

Private Sub Pic1_Click(sender As Object, e As EventArgs) Handles Pic1.Click 
    Const MyNumber As Integer = 1 
    Lbl1.Visible = False 
    Pic1.Visible = False 
    MyValue = Briefcases(MyNumber) 
    Dim action As Integer = 0 
    If GlobalAction = 0 Then 
     LblMyBriefcase.Text = CStr(MyNumber) 
     action = 1 
     GlobalAction = 1 
    End If 

    If action = 0 Then 
     longif() 
    End If 

End Sub 

Private Sub Lbl2_Click(sender As Object, e As EventArgs) Handles Lbl2.Click 
    Const MyNumber As Integer = 2 
    Lbl2.Visible = False 
    Pic2.Visible = False 
    MyValue = Briefcases(MyNumber) 
    Dim action As Integer = 0 
    If GlobalAction = 0 Then 
     LblMyBriefcase.Text = CStr(MyNumber) 
     action = 1 
     GlobalAction = 1 
    End If 
    If action = 0 Then 
     longif() 
    End If 
End Sub 

Private Sub Pic2_Click(sender As Object, e As EventArgs) Handles Pic2.Click 
    Const MyNumber As Integer = 2 
    Lbl2.Visible = False 
    Pic2.Visible = False 
    Dim action As Integer = 0 
    MyValue = Briefcases(MyNumber) 
    If GlobalAction = 0 Then 
     LblMyBriefcase.Text = CStr(MyNumber) 
     action = 1 
     GlobalAction = 1 
    End If 
    If action = 0 Then 
     longif() 
    End If 
End Sub 

Private Sub Lbl3_Click(sender As Object, e As EventArgs) Handles Lbl3.Click 
    Const MyNumber As Integer = 3 
    Lbl3.Visible = False 
    Pic3.Visible = False 
    Dim action As Integer = 0 
    MyValue = Briefcases(MyNumber) 
    If GlobalAction = 0 Then 
     LblMyBriefcase.Text = CStr(MyNumber) 
     action = 1 
     GlobalAction = 1 
    End If 
    If action = 0 Then 
     longif() 
    End If 
End Sub 

Private Sub Pic3_Click(sender As Object, e As EventArgs) Handles Pic3.Click 
    Const MyNumber As Integer = 3 
    Lbl3.Visible = False 
    Pic3.Visible = False 
    Dim action As Integer = 0 
    MyValue = Briefcases(MyNumber) 
    If GlobalAction = 0 Then 
     LblMyBriefcase.Text = CStr(MyNumber) 
     action = 1 
     GlobalAction = 1 
    End If 
    If action = 0 Then 
     longif() 
    End If 
End Sub 

Private Sub Lbl4_Click(sender As Object, e As EventArgs) Handles Lbl4.Click 
    Const MyNumber As Integer = 4 
    Lbl4.Visible = False 
    Pic4.Visible = False 
    Dim action As Integer = 0 
    MyValue = Briefcases(MyNumber) 
    If GlobalAction = 0 Then 
     LblMyBriefcase.Text = CStr(MyNumber) 
     action = 1 
     GlobalAction = 1 
    End If 
    If action = 0 Then 
     longif() 
    End If 
End Sub 

Private Sub Pic4_Click(sender As Object, e As EventArgs) Handles Pic4.Click 
    Const MyNumber As Integer = 4 
    Lbl4.Visible = False 
    Pic4.Visible = False 
    Dim action As Integer = 0 
    MyValue = Briefcases(MyNumber) 
    If GlobalAction = 0 Then 
     LblMyBriefcase.Text = CStr(MyNumber) 
     action = 1 
     GlobalAction = 1 
    End If 
    If action = 0 Then 
     longif() 
    End If 
End Sub 

    ............... (the same code just continues for the different picboxes  and labels up to 26) 


End Class 

ich die Werte der übrigen Aktenkoffer in der RemainingBriefcases Sammlung haben will, so entferne ich den ausgewählten Wert in der longif() Funktion. Es funktioniert jedoch für die ersten paar Klicks, aber nach ein paar markiert es eine der RemainingBrieffälle.Entfernen Sie Anweisungen und sagt Collection-Index muss im Bereich 1 bis zur Größe der Sammlung sein. Was soll ich ändern? Dank

+0

Das Problem bekommen, ist wahrscheinlich, dass, wie Sie Elemente, die die Größe der Liste entfernen wird kürzer. Also sind alle deine Indizes falsch. – Derek

+0

@Derek Gibt es eine Möglichkeit, die neuen Indizes zu bekommen? –

+0

Sie müssen überdenken, wie Sie Elemente entfernen. Wenn Sie eine Sammlung {1,2,3} haben und Sie den ersten Gegenstand entfernen, bleibt Ihnen {2,3}. Entferne den zweiten Gegenstand und du bleibst {2}. Kannst du sehen, wie es schief geht? –

Antwort

0

Als Erweiterung meines früheren Kommentars habe ich ein neues Windows Forms-Projekt erstellt. Ich habe ein Label für "LblTurnNumber" hinzugefügt, ein Panel "pnlBriefcases", um die Aktentaschen anzuzeigen, und ein Panel "valuesLabels", um die Werte anzuzeigen, die nicht ausgewählt wurden.

Option Infer On 
Option Strict On 

Public Class FrmGameBoard 

    Dim briefcases As List(Of Briefcase) 
    Dim valuesLabels As List(Of Label) 
    Dim clicksProcessed As Integer = 0 

    Class Briefcase 
     Property Value As Decimal 
     Property AssociatedLabel As Label 
     Property AssociatedPictureBox As PictureBox 
     Property IsAvailable As Boolean = True 

    End Class 

    Private Sub Briefcase_Click(sender As Object, e As EventArgs) 
     ' get the control which raised the event 
     Dim ctrl = DirectCast(sender, Control) 
     ' get the briefcase for that control 
     Dim bc = DirectCast(ctrl.Tag, Briefcase) 

     bc.AssociatedLabel.Visible = False 
     bc.AssociatedPictureBox.Visible = False 

     ' I don't know the purpose of the following line: I carried it over from the example oode 
     ' referring to Briefcases vs. RemainingBriefcases 
     bc.IsAvailable = False 

     ' Find the value in the available values corresponding to the item clicked on... 
     Dim valueToRemove = bc.Value.ToString() 
     Dim valueToHide = valuesLabels.First(Function(vl) vl.Text = valueToRemove) 

     valueToHide.Visible = False 

     clicksProcessed += 1 
     LblTurnNumber.Text = clicksProcessed.ToString() 

    End Sub 

    Sub Init() 
     Dim rand As New Random() 
     Dim values() As Decimal = {0.01D, 0.02D, 0.05D, 0.1D, 0.25D, 0.5D, 0.75D, 1D, 2.5D, 5D, 10D, 25D, 50D, 100D, 500D, 1000D, 5000D, 10000D, 50000D, 100000D, 250000D, 500000D, 750000D, 1000000D, 1250000D, 1500000D} 

     ' Create a set of labels showing the available values 
     ' and show them in a panel named "valuesPanel". 
     valuesLabels = New List(Of Label) 

     For i = 0 To values.Length - 1 
      Dim valueLabel As New Label With {.Text = values(i).ToString()} 
      valueLabel.TextAlign = ContentAlignment.MiddleRight 
      Dim yPos = valuesPanel.Height - 24 * (i + 1) 
      valueLabel.Location = New Point(6, yPos) 
      valuesPanel.Controls.Add(valueLabel) 
      valuesLabels.Add(valueLabel) 

     Next 

     ' Get a shuffled list of the values 
     Dim shuffledValues As New List(Of Decimal) 
     For i = 0 To values.Length - 1 
      shuffledValues.Insert(rand.Next(0, i), values(i)) 
     Next 

     ' Create briefcases with imaages and labels 
     ' and associate those to UI elements. 

     briefcases = New List(Of Briefcase) 

     For i = 0 To values.Count - 1 
      Dim lbl As New Label 
      Dim pb As New PictureBox 

      ' N.B. The following is a crude and unsatisfactory way to display the briefcases and 
      ' requires improvement. 

      'TODO: set the text of lbl and the image of pb properly 
      'TODO: set the position of lbl and the position of pb properly 
      pb.Image = Bitmap.FromFile("C:\temp\briefcase.png") 
      Dim xSize = pb.Image.Width 
      Dim ySize = pb.Image.Height 
      Dim xLoc = (i Mod 13) * xSize ' magic number 13 to make two rows of briefcases because there are 26 of them 
      Dim yLoc = (i \ 13) * ySize + 40 ' magic number 40 to crudely account for label size 

      pb.Size = pb.Image.Size 
      pb.Location = New Point(xLoc, yLoc) 
      lbl.Location = New Point(xLoc, yLoc + ySize) 

      lbl.Text = "???" & i.ToString() 

      ' Tell it what to do when the Label or PictureBox is clicked... 
      AddHandler lbl.Click, AddressOf Briefcase_Click 
      AddHandler pb.Click, AddressOf Briefcase_Click 

      ' Show the controls we have created... 
      pnlBriefcases.Controls.Add(lbl) 
      pnlBriefcases.Controls.Add(pb) 

      ' Create a Briefcase which has a value and is connected to the label and picturebox: 
      Dim thisBriefcase = New Briefcase With {.Value = shuffledValues(i), .AssociatedLabel = lbl, .AssociatedPictureBox = pb} 

      ' Connect the label and picturebox to the Briefcase 
      ' - the .Tag holds an Object, i.e. anything we want as long as we know what to convert it back to when we use it. 
      lbl.Tag = thisBriefcase 
      pb.Tag = thisBriefcase 

      briefcases.Add(thisBriefcase) 

     Next 

     LblTurnNumber.Text = clicksProcessed.ToString() 

    End Sub 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Init() 

    End Sub 

End Class 

Das Bild "C: \ temp \ briefcase.png" ist

enter image description here

Programmstart zeigt:

enter image description here

(ich sagte es Verbesserungen notwendig für die UI ...) und nach dem Klicken ein paar Bilderboxen/Etiketten ...

enter image description here

Wenn Sie die Aktenkoffer verarbeiten müssen, die noch angezeigt werden, können Sie eine Liste von ihnen mit so etwas wie

Dim stillShown = briefcases.Where(Function(bc) bc.IsAvailable).ToList() 
+0

Vielen Dank. Es ist perfekt1 –

0
Dim briefcases As List(Of Double) = New List(Of Double) 
briefcases.Add(1.0) 
briefcases.Add(2.0) 
briefcases.Add(3.0) 
briefcases.Remove(2.0) 

So können Sie Artikel nach Nummer entfernen.

Verwandte Themen