Tak jsem se na to díval, a D je správně.: a) skutečně For i=0 to ... si vyhodnotí výraz "To" na začátku cyklu, proto se již nepřizpůsobí změněné délce kolekce a zavede Vás mimo její dimenze b) dokonce ani to For each není lékem (myslel jsem, že je trošku inteligentnější), ale aby se cyklus nemusel zaobírat nějakým ošetřováním změny rozsahu, tak Vám jednoduše vyhodí chybu, pokud procházenou kolekci změníte c) ještě pro procházení kolekcemi je možno použít enumerator, ten jsem teď sice nezkoušel, ale v dokumentaci píšou, že se nesmí použít k modifikaci procházené kolekce d) takže zbývá možnost D, tj ten obezný do while cyklus, nějak asi tak (pouze systém řešení):
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
TextBox1.Text = ""
Dim seznam As New List(Of Integer)
seznam.Add(0)
seznam.Add(1)
seznam.Add(2)
seznam.Add(3)
seznam.Add(4)
TextBox1.Text = "počet prvků: " & seznam.Count & vbCrLf
Dim i As Integer = 0
Do While i < seznam.Count
TextBox1.Text &= i.ToString & " - " & seznam(i) & vbCrLf
If seznam(i) Mod 2 = 0 Then
seznam.Remove(i)
Else
i += 1
End If
Loop
TextBox1.Text &= "počet prvků: " & seznam.Count & vbCrLf
End Sub
pokud toto spustím, tak dostanu výpis: počet prvků: 5 0 - 0 0 - 1 1 - 2 1 - 3 2 - 4 počet prvků: 2 tj. na začátku má colekce 5 prvků pak procházím prvek 0, který má obsah 0, dále procházím opět prvek 0, teď má ale obsah 1 (ten předchozí jsem smazal a všechny následující se mi tím pádem posunuly) atd.atd - projdu všechny prvky a nevyvede mě z míry změna rozsahu kolekce.
|