none
Añadir elementos a una lista mientras se itera sobre esta RRS feed

  • Pregunta

  • Buenas noches a todos. Tengo un problema implementando un programa de analisis sintactico SLR. Lo que ocurre es que intento añadir una lista a una lista de listas de la siguiente forma:

    List<List<String>> conjuntosFormados = new List<List<string>>();
    
    foreach (List<String> lista in conjuntosFormados)
    {
        foreach (String c in X)
        {
             List<String> nuevoConjunto = ir_a(lista, c, produccionesAumentada);
    
             if (nuevoConjunto.Count > 0)
             {
                 conjuntosFormados.Add(nuevoConjunto);
             }
        }
    }

    El problema de esto es que me lanza una excepción perfectamente valida y que se porque ocurre:

    Colección modificada; puede que no se ejecute la operación de enumeración.

    Mi pregunta es: ¿Habra alguna forma de solucionar este problema?

    Gracias por sus respuestas.

    Intente hacerlo con un ciclo for, el resultado fue que el programa se atasco, sin dejarme avanzar al siguiente paso, y todo lo que pude hacer fue detener la depuración.

    miércoles, 24 de mayo de 2017 6:06

Respuestas

  • hola

    >>¿Habra alguna forma de solucionar este problema?

    si, trabajando con una lista auxiliar

    List<List<String>> listaTemp = new List<List<string>>();
    
    List<List<String>> conjuntosFormados = new List<List<string>>();
    
    foreach (List<String> lista in conjuntosFormados)
    {
        foreach (String c in X)
        {
             List<String> nuevoConjunto = ir_a(lista, c, produccionesAumentada);
    
             if (nuevoConjunto.Count > 0)
             {
                 listaTemp.Add(nuevoConjunto);
             }
        }
    }
    
    foreach (List<String> item in listaTemp)
    {
    	conjuntosFormados.Add(item);
    }

    agregas a una lista temporal mientras procesas y al final vuelcas de la temporal a la definitiva

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 24 de mayo de 2017 6:17

Todas las respuestas

  • hola

    >>¿Habra alguna forma de solucionar este problema?

    si, trabajando con una lista auxiliar

    List<List<String>> listaTemp = new List<List<string>>();
    
    List<List<String>> conjuntosFormados = new List<List<string>>();
    
    foreach (List<String> lista in conjuntosFormados)
    {
        foreach (String c in X)
        {
             List<String> nuevoConjunto = ir_a(lista, c, produccionesAumentada);
    
             if (nuevoConjunto.Count > 0)
             {
                 listaTemp.Add(nuevoConjunto);
             }
        }
    }
    
    foreach (List<String> item in listaTemp)
    {
    	conjuntosFormados.Add(item);
    }

    agregas a una lista temporal mientras procesas y al final vuelcas de la temporal a la definitiva

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 24 de mayo de 2017 6:17
  • Hay al menos dos formas sencillas de evitar el error.

    La primera es cambiar el "foreach" por un "for". El "for" sí que permite modificar sobre la marcha la colección sobre la que estás iterando:

    for (int i=0; i<conjuntosFormados.Count(); i++)
    { List<String> lista = conjuntosFormados[i]; //...

    La segunda es sacar una copia de la lista para iterar sobre la copia, y dejar que el bucle modifique la colección original (no la copiada):

    foreach (List<String> lista in conjuntosFormados.ToArray())...


    Editado: Nótese que hay una diferencia importante entre las dos opciones: la primera es "dinámica" en el sentido de que el bucle recorrerá los elementos que se hayan añadido sobre la marcha. La segunda es "fija": el bucle sólo iterará sobre los elementos que había al principio, no sobre los que se añadieron desde dentro del bucle.
    miércoles, 24 de mayo de 2017 6:20
    Moderador