J'ai l'impression que quelqu'un a oublié de le lire le topic en entier
Pour résumer, foreach utilise un énumérateur pour le parcours, l'énumérateur yield tous les objets de la collection lors du premier passage dans le foreach (en gros). Donc quand tu fais un dispose sur un des éléments, tu déséquilibre le foreach car la collection contient un élément de moins tandis que le foreach a toujours le même nombre d'élément. C'est à peu près le schéma du problème.
L'idée est donc d'arriver à "foreacher" une collection en étant capable de supprimer des éléments sans déséquilibrer l'énumérateur. C'est la raison pour laquelle olsimare rafraichit l'énumérateur par le retour au début du foreach (avec le goto). <avis personnel>Je trouve que c'est très laid</avis personnel>. J'ai donc suggéré de parcourir les éléménts sans itérateur mais avec un for et de supprimer le dernier élément à chaque fois.
PS : Pour les pointilleux en fait, le foreach est remplacé par un GetEnumerator et un while moveNext() par le compilateur, c'est la raison pour laquelle le goto fonctionne car, il "remonte" le traitement à l'instruction GetEnumerator.
Une idée me vient comme ça :
1 2 3
| While (maCollection.GetEnumerator().MoveNext())
maCollection.GetEnumerator().Current.Dispose()
End While |
Veuillez excuser mon VB.NET un peu crotteux.
Partager