Veo varios fragmentos de la respuesta correcta aquí, pero permítanme reunirlos todos y explicar un par de cosas.
En primer lugar, AcceptChanges
solo debe usarse para marcar la transacción completa en una tabla como validada y confirmada. Lo que significa que si está utilizando DataTable como una fuente de datos para vincularse a, por ejemplo, un servidor SQL, llamar AcceptChanges
manualmente garantizará que los cambios nunca se guarden en el servidor SQL .
Lo que hace que este problema sea más confuso es que en realidad hay dos casos en los que se lanza la excepción y tenemos que evitarlos.
1. Modificar la colección de un IEnumerable
No podemos agregar o eliminar un índice a la colección que se está enumerando porque hacerlo puede afectar la indexación interna del enumerador. Hay dos formas de evitar esto: o haga su propia indexación en un ciclo for, o use una colección separada (que no esté modificada) para la enumeración.
2. Intentar leer una entrada eliminada
Dado que las tablas de datos son colecciones transaccionales , las entradas se pueden marcar para su eliminación, pero aún aparecen en la enumeración. Lo que significa que si solicita una entrada eliminada para la columna "name"
, arrojará una excepción. Lo que significa que debemos verificar si dr.RowState != DataRowState.Deleted
antes de consultar una columna.
Poniendolo todo junto
Podríamos ensuciarnos y hacer todo eso manualmente, o podemos dejar que DataTable haga todo el trabajo por nosotros y hacer que la declaración se parezca más a una llamada SQL haciendo lo siguiente:
string name = "Joe";
foreach(DataRow dr in dtPerson.Select($"name='{name}'"))
dr.Delete();
Al llamar a la Select
función de DataTable , nuestra consulta evita automáticamente las entradas ya eliminadas en DataTable. Y dado que la Select
función devuelve una matriz de coincidencias, la colección sobre la que estamos enumerando no se modifica cuando llamamos dr.Delete()
. También he condimentado la expresión Seleccionar con interpolación de cadenas para permitir la selección de variables sin hacer que el código sea ruidoso.
[ii]
a[i]
, sin embargo :-)