jueves, 24 de febrero de 2011

Usos y Diferencias del For y Foreach

Primero voy a comenzar explicando el uso de ambos. Como muchos sabrán, su uso es muy similar, ambos son ciclos que realizan determinada acción. En nuestro ejemplo, simplemente vamos a recorrer un array y mostrarlo.

En Visual Basic 6.0

FOR FOR EACH
For i = 0 To 9
    MsgBox vector(i)
Next i
For Each vec In vector
    MsgBox vec
Next

En C#
FOR FOREACH
for (int i = 0; i < vector.Length; i++)
{
   MessageBox.Show(vector[i].ToString());
}
foreach (int vec in vector)
{
   MessageBox.Show(vec.ToString());
}

En PHP
FOR FOREACH
for ($i = 0; i < count($vector); $i++)
{
   echo $vector[$i];
}
foreach ($vector as $vec)
{
   echo $vec;
}

Como podemos observar, en los 3 lenguajes que citamos, aparentemente el foreach es más cómodo a la hora de escribir. Pero que pasa con el rendimiento? es el mismo?
No, no es lo mismo internamente consume mas recursos el foreach, no es lo mismo ir incrementando un índice e ir a buscar a memoria el dato con ese índice, que traer todo el elemento entero. En nuestro caso el elemento es unicamente un entero, pero que pasa si la estructura es mas compleja? Ahí notamos la diferencia aunque esto es un decir, debido a que con la velocidad de procesamiento, sería imperceptible.

Mi Sugerencia

A mi particularmente no me agrada el tema de usar ciclos, trato de evitarlo siempre que pueda (por ejemplo utilizando Reflexión en caso de ser posible). Cuando el ciclo es realmente necesario, les voy a ser sincero me inclino más por el foreach, solo por una cuestión de comodidad, porque como mencionamos anteriormente su rendimiento es mucho peor con respecto al del for.

2 comentarios:

  1. Que tal como estas

    Refiriendonos a los ciclos quiesiera hacerte una consulta como puedo hacer para comparar dos ciclos de 2 listview y eliminar los items que sean iguales y me deje los diferentes

    te agradeceria me puedieras apoyar con este tema Brother

    Saludos

    ResponderEliminar
  2. Samuel,
    ya que no me dijiste en que lenguaje estas programandolo, voy a explicarte la logica que deberias aplicar.

    Lo que tendrias que hacer es recorrer en primer lugar uno de los 2 listviews y para cada registro que leas, deberias recorrer el otro listview en busca de esa igualdad. En caso de encontrarse el elemento en el segundo listview deberias eliminarlo. De esta forma cuando tu ciclo finalice, tendrias ambos listview sin repetir elementos.
    Esta solucion es en caso de que no importe sobre cual eliminar repetidos, sino tendrias que ajustarla.

    for (int i = 0; i < Lista1.Items.Length; i++)
    {
    for (int k = 0; k < Lista2.Items.Length; k++)
    {
    if(Lista1.Items[i].Value == Lista2.Items[k].Value)
    {
    //Remover el item "k" de la Lista2
    break;
    }
    }
    }

    El codigo podria variar dependiendo el lenguaje que uses, pero la idea es anidar 1 ciclo dentro del otro.

    Espero que te haya servido.

    Saludos

    ResponderEliminar