Foreach

01/07/2006 - 20:59 por mickro | Informe spam
Hola, tengo el siguiente codigo:

foreach(DataRow row in ds.tblProductos.Rows)
{
if(row.Codigo = = 100)
{
row.Delete();
}
}

Pero me da un error que dice que la Coleccion fue modificada (porque elimino
un DataRow). Lo que quiero hacer es eliminar todos lo registros que tengan
como Codigo el numero 100. He intentado hacerlo con un bucle FOR y si
funciono, pero necesito hacer mas cosas dentro del bucle y con el FOREACH me
es mas comodo. Hay alguna forma de hacer esto con el FOREACH??

Gracias y Saludos!!

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
01/07/2006 - 21:47 | Informe spam
"mickro" wrote in message
news:%
foreach(DataRow row in ds.tblProductos.Rows)
{
if(row.Codigo = = 100)
{
row.Delete();
}
}

Pero me da un error que dice que la Coleccion fue modificada (porque
elimino un DataRow). Lo que quiero hacer es eliminar todos lo registros
que tengan como Codigo el numero 100. He intentado hacerlo con un bucle
FOR y si funciono, pero necesito hacer mas cosas dentro del bucle y con el
FOREACH me es mas comodo. Hay alguna forma de hacer esto con el FOREACH??



No. Una regla del foreach es que dentro del bucle no se puede modificar
la colección que se está recorriendo. Tus alternativas son, o bien utilizar
un bucle "for", cosa que ya has probado, o dentro del bucle extraer en
memoria una lista de todos los registros que tienen el código 100 y luego
borrarlos fuera del bucle foreach con otro bucle distinto (este segundo
bucle sí que funciona porque está recorriendo una lista diferente de la que
se está modificando).
Respuesta Responder a este mensaje
#2 Fran Peula Ariza
03/07/2006 - 08:40 | Informe spam
Utiliza una copia del datatable. Más o menos algo así:

VB.NET

Dim dtAux As DataTable = dt.Copy()
Dim i As Integer = 0

For Each dr As DataRow In dt.Rows

'Hacer lo que sea, utilizando el i como indizador para poder acceder a los
diferentes elementos de dtAux

Next

C#

DataTable dtAux = dt.Copy();
int i = 0;

foreach (DataRow dr in dt.Rows)
{

//Hacer lo que sea, utilizando el i como indizador para poder acceder a los
diferentes elementos de dtAux

}


A ver si te sirve esto ;)

Saludos

Fran Peula Ariza
Respuesta Responder a este mensaje
#3 James Cole
03/07/2006 - 09:36 | Informe spam
Y por que no pruebas de hacer un "for" pero después de eliminar, re
posicionar correctamente el contador para que la continuación del bucle
funcione correctamente?

Creo haberlo hecho en algun lenguaje aunque no recuerdo la sintaxis.

Creo que seria algo asi, pero no estoy seguro.

for(int i=0; i < ds.tblProductos.Rows.Count(); i++)
{
if (row.Codigo = = 100)
{
row.Delete();
i--; // Para que count i i++ den el resultado correcto
}
}

:
Hola, tengo el siguiente codigo:

foreach(DataRow row in ds.tblProductos.Rows)
{
if(row.Codigo = = 100)
{
row.Delete();
}
}

Pero me da un error que dice que la Coleccion fue modificada (porque elimino
un DataRow). Lo que quiero hacer es eliminar todos lo registros que tengan
como Codigo el numero 100. He intentado hacerlo con un bucle FOR y si
funciono, pero necesito hacer mas cosas dentro del bucle y con el FOREACH me
es mas comodo. Hay alguna forma de hacer esto con el FOREACH??

Gracias y Saludos!!


Respuesta Responder a este mensaje
#4 Vyacheslav Popov
03/07/2006 - 17:22 | Informe spam
James, esto es precisamente lo que NO DEBE hace en un bucle "for". Es el
primer fallo de mala programación. Si modificas la (i) usa bucles "while" o
"do..while"

Respecto a la solución, hay que usar iteradores.

Saludos.


"James Cole" escribió en el mensaje
news:
Y por que no pruebas de hacer un "for" pero después de eliminar, re
posicionar correctamente el contador para que la continuación del bucle
funcione correctamente?

Creo haberlo hecho en algun lenguaje aunque no recuerdo la sintaxis.

Creo que seria algo asi, pero no estoy seguro.

for(int i=0; i < ds.tblProductos.Rows.Count(); i++)
{
if (row.Codigo = = 100)
{
row.Delete(); i--; // Para que count i i++ den el resultado
correcto
}
}

:
Hola, tengo el siguiente codigo:

foreach(DataRow row in ds.tblProductos.Rows)
{
if(row.Codigo = = 100)
{
row.Delete();
}
}

Pero me da un error que dice que la Coleccion fue modificada (porque
elimino un DataRow). Lo que quiero hacer es eliminar todos lo registros
que tengan como Codigo el numero 100. He intentado hacerlo con un bucle
FOR y si funciono, pero necesito hacer mas cosas dentro del bucle y con
el FOREACH me es mas comodo. Hay alguna forma de hacer esto con el
FOREACH??

Gracias y Saludos!!
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida