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