Comprender el código: expresiones lambda

Estaba mirando este código de un tamiz de eratóstenes, pero aún no podía entender cómo se incrementa la variable "i", ya que tengo un conocimiento limitado sobre las expresiones lambda y la documentación no me ayudó mucho. ¿Alguien puede explicar?

int cur = 1, total = 1000;
var pc = Enumerable.Range(2, total).ToList();

while(cur <= Math.Sqrt(total))
{
    cur = pc.First(i => i > cur);
    pc.RemoveAll(i => i != cur && i % cur == 0);
}

Console.WriteLine(pc.Max()); 

preguntado el 30 de junio de 12 a las 14:06

4 Respuestas

En realidad no está incrementado; en ambas expresiones lambda en este código i se utiliza como marcador de posición temporal para uno o más valores actualmente procesados. A saber,

cur = pc.First(i => i > cur);

significa "Tomar primero valor que es mayor que cur en pc y asignarlo a cur".

pc.RemoveAll(i => i != cur && i % cur == 0);

significa "Tomar todo valores que no son iguales a cur y tener cero recordatorio de la división por cur y eliminarlos de la pc".

Respondido el 30 de junio de 12 a las 14:06

Así que corrígeme si me equivoco... Durante la primera iteración, ¿el primer valor de i será 2? - priyank kapadia

No es la variable i sino cur la que controla cuándo salir del bucle

Respondido el 30 de junio de 12 a las 14:06

La variable cur se actualiza en el bucle while:

cur = pc.First(i => i > cur); 

i es simplemente parte del predicado que devuelve la primera aparición donde i > cur. En otras palabras, es una variable local en estos casos.

Respondido el 30 de junio de 12 a las 14:06

No se incrementa, depende de que se eliminen los miembros de la PC hasta que no se cumpla la condición while.

Piense en ello como la diferencia entre

index = 1000;
while (index > 0)
{
    pc.Remove(index);
    index--;
}

y

while (pc.Count > 0)
{
   pc.Remove(0);
}

Respondido el 30 de junio de 12 a las 14:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.