2010-11-04 4 views
1

Dans ma boucle, j'essaie de supprimer des éléments d'une liste qui ont un certain nom. Je ne peux pas le faire avec un for-each, donc j'ai essayé un for-loop régulier. Il semble que la boucle for ne fonctionne pas comme prévu. Cela dépasse toujours la limite. J'ai dû mettre un if-then pour sortir de la boucle (solution très moche). J'essaie de trouver la bonne façon d'accomplir cela.Modification des variables d'incrémentation pour que la boucle dépasse la limite

Dim canShowNextTable As Boolean = False 
    Dim allTablesInTab As List(Of Control) = ctrlFinder.GetTypeOfControls("Table", parentForm.Controls) 
    Dim totalTables As Integer = allTablesInTab.Count - 1 
    For i As Integer = 0 To totalTables 
     If allTablesInTab.Item(i).ID = "CustomerTable" Or _ 
      allTablesInTab.Item(i).ID = "PMTable" Or _ 
      allTablesInTab.Item(i).ID = "TableAListClrnCheck" Or _ 
      allTablesInTab.Item(i).ID = "TableBListClrnCheck" Or _ 
      allTablesInTab.Item(i).ID = "TableCListClrnCheck" Or _ 
      allTablesInTab.Item(i).ID = "TableDListClrnCheck" Or _ 
      allTablesInTab.Item(i).ID = "TableSignature" Then  '' If the ID is one of these remove it from list 
      allTablesInTab.Remove(allTablesInTab.Item(i)) 
      totalTables = totalTables - 1       '' Decrement number of tables to loop through 
      i = -1             '' Reset counter to prevent going over or premature stopping 
     End If 
     If i = 3 AndAlso totalTables = 3 Then      '' Since loop continuously goes over limit, use if-then to exit for-loop 
      Exit For 
     End If 
    Next 

Répondre

3

Vous devez traverser la boucle en sens inverse, car une fois que vous supprimez un élément du nombre total a changé et n'est plus correct. Boucler en sens inverse évite ce problème.

For i As Integer = totalTables To 0 Step -1 

En outre, au lieu de allTablesInTab.Remove(allTablesInTab.Item(i)) vous pouvez utiliser:

allTablesInTab.RemoveAt(i) 

travail dans cette logique sur le papier ou le débogueur pour bien saisir le concept de ce qui se passe. Vous pourriez également trouver cette question connexe utile. C'est en C# mais les concepts sont les mêmes: How to remove elements from a generic list while iterating around it?

+0

+1 Vous pourriez envisager d'ajouter la syntaxe. –

+0

@Conrad merci, vous pourriez m'a attrapé mi-edit :) –

+0

Merci messieurs. Ça a marché comme sur des roulettes. – dotnetN00b

Questions connexes