J'ai le cas classique d'essayer de supprimer un élément d'une collection tout en l'énumérant dans une boucle:
List<int> myIntCollection = new List<int>();
myIntCollection.Add(42);
myIntCollection.Add(12);
myIntCollection.Add(96);
myIntCollection.Add(25);
foreach (int i in myIntCollection)
{
if (i == 42)
myIntCollection.Remove(96); // The error is here.
if (i == 25)
myIntCollection.Remove(42); // The error is here.
}
Au début de l'itération après une modification, un InvalidOperationException
est levé, car les énumérateurs n'aiment pas quand la collection sous-jacente change.
Je dois apporter des modifications à la collection lors de l'itération. Il existe de nombreux modèles qui peuvent être utilisés pour éviter cela , mais aucun d'entre eux ne semble avoir une bonne solution:
Ne supprimez pas à l'intérieur de cette boucle, conservez plutôt une «liste de suppression» séparée, que vous traitez après la boucle principale.
C'est normalement une bonne solution, mais dans mon cas, j'ai besoin que l'élément disparaisse instantanément car «attendre» qu'après la boucle principale pour vraiment supprimer l'élément change le flux logique de mon code.
Au lieu de supprimer l'élément, définissez simplement un indicateur sur l'élément et marquez-le comme inactif. Ajoutez ensuite la fonctionnalité du modèle 1 pour nettoyer la liste.
Ce serait travailler pour tous mes besoins, mais cela signifie que beaucoup de code à changer afin de vérifier le drapeau inactif chaque fois qu'un élément est accessible. C'est beaucoup trop d'administration à mon goût.
Incorporez d'une manière ou d'une autre les idées du modèle 2 dans une classe qui dérive de
List<T>
. Cette super liste gérera l'indicateur inactif, la suppression des objets après coup et n'exposera pas non plus les éléments marqués comme inactifs aux consommateurs d'énumération. Fondamentalement, il encapsule simplement toutes les idées du modèle 2 (et par la suite du modèle 1).Une classe comme celle-ci existe-t-elle? Quelqu'un a-t-il un code pour cela? Ou y a-t-il un meilleur moyen?
On m'a dit qu'accéder
myIntCollection.ToArray()
au lieu demyIntCollection
résoudrait le problème et me permettrait de supprimer à l'intérieur de la boucle.Cela me semble être un mauvais modèle de conception, ou peut-être que ça va?
Détails:
La liste contiendra de nombreux éléments et je n'en supprimerai que quelques-uns.
À l'intérieur de la boucle, je vais faire toutes sortes de processus, ajouter, supprimer, etc., donc la solution doit être assez générique.
L'élément que je dois supprimer n'est peut- être pas l'élément actuel de la boucle. Par exemple, je peux être sur l'élément 10 d'une boucle de 30 éléments et avoir besoin de supprimer l'élément 6 ou l'élément 26. Marcher en arrière dans le tableau ne fonctionnera plus à cause de cela. ; o (