Verrebbe naturale di fare un ciclo su ogni elemento della lista, eseguire l’operazione e rimuovere l’elemento:
foreach (Command c in itsCommands) { c.Execute(); itsCommands.Remove(c); }
Purtroppo però così facendo otteniamo un eccezione che ci avvisa che la collezione è stata modificata (in effetti abbiamo rimosso un elemento) e quindi l’operazione di ciclo sulla collezione non è più valida.
Come soluzione al problema si potrebbe crea un altra collezione con gli elementi da rimuovere ed eseguire un altro ciclo per eliminare i comandi eseguiti:
Commands itsCommandsForDelete = new Commands(); foreach (Command c in itsCommands) { c.Execute(); itsCommandsForDelete.Add(c); } foreach (Command c in itsCommandsForDelete) { itsCommands.Remove(c); }
Questa soluzione non è molto performante perchè ci obbliga ad eseguire il ciclo su ogni elemento per due volte.
Ecco una soluzione alternativa per eseguire il tutto in un solo ciclo:
while (itsCommands.Count > 0) { Command c = (Command) itsCommands[0]; itsCommands.RemoveAt(0); c.Execute(); }
Nessun commento:
Posta un commento