Muy a menudo necesito algo así:Práctica recomendada para evitar InvalidOperationException: ¿Se modificó la recopilación?
foreach (Line line in lines)
{
if (line.FullfilsCertainConditions())
{
lines.Remove(line)
}
}
Esto no funciona, porque siempre me dan una InvalidOperationException
porque el enumerador se cambió durante el bucle.
así que cambié todos mis bucles de este tipo a lo siguiente:
List<Line> remove = new List<Line>();
foreach (Line line in lines)
{
if (line.FullfilsCertainConditions())
{
remove.Add(line)
}
}
foreach (Line line in remove) {
{
lines.Remove(line);
}
No estoy seguro si esto es realmente la mejor manera ya que en el peor de los casos tengo que repetir 2 veces sobre el original lista y necesita tiempo 2n en lugar de n.
¿Hay una mejor manera de hacerlo?
EDIT:!
yo era capaz de hacer que el uso de respuesta de Mark Pero ¿y si no lo hace mi colección de aperos RemoveAll()?
Por ejemplo, un EDITAR
System.Windows.Controls.UIElementCollection
2:
vez más con la ayuda de Marcos ahora soy capaz de hacer la siguiente llamada a eliminar todos ScatterViewItems:
CollectionUtils.RemoveAll(manager.getWindow().IconDisplay.Items, elem => elem.GetType() == typeof(ScatterViewItem));
tengo el mismo problema hace algún tiempo y no hay solución. Es incluso peor: no es 2n sino n^2 ya que 'lines.Remove (line)' itera nuevamente sobre la colección. – Matten
Pero O (2n) es igual a O (n) :-) realmente: en Java puede usar un iterador para hacer esto, o ir a una implementación de colección de copia en escritura que permite modificaciones mientras itera. – Waldheinz
Re la actualización - ver mi edición –