2009-12-17 16 views

Respuesta

33

Una diferencia clave es el método .ForEach se puede modificar la colección subyacente. Con la sintaxis foreach obtendrá una excepción si lo hace. Aquí hay un ejemplo de eso (no exactamente el mejor aspecto pero funciona):

static void Main(string[] args) { 
    try { 
     List<string> stuff = new List<string>(); 
     int newStuff = 0; 

     for (int i = 0; i < 10; i++) 
      stuff.Add("."); 

     Console.WriteLine("Doing ForEach()"); 

     stuff.ForEach(delegate(string s) { 
      Console.Write(s); 

      if (++newStuff < 10) 
       stuff.Add("+"); // This will work fine and you will continue to loop though it. 
     }); 

     Console.WriteLine(); 
     Console.WriteLine("Doing foreach() { }"); 

     newStuff = 0; 

     foreach (string s in stuff) { 
      Console.Write(s); 

      if (++newStuff < 10) 
       stuff.Add("*"); // This will cause an exception. 
     } 

     Console.WriteLine(); 
    } 
    catch { 
     Console.WriteLine(); 
     Console.WriteLine("Error!"); 
    } 

    Console.ReadLine(); 
} 
+1

Acabo de recibir mis "nuevas cosas aprendidas" para hoy. Gracias. –

+3

Esto es porque bajo las mantas, 'ForEach (Acción )' utiliza un bucle. En Reflector se ve así: 'for (int i = 0; i

+3

(Curiosamente, Reflector también muestra que alguien en Microsoft descuidadamente cortó y pegó la verificación nula de uno de los métodos 'List ' con un parámetro llamado "coincidencia". Si pasa null como 'Acción ', es ' Te diré que el parámetro "coincidencia" es nulo en lugar del parámetro de "acción" correcto. –

0

Es una forma/taquigrafía más conveniente para ejecutar una acción en los elementos de la lista, MoreLinq amplía esta funcionalidad para todos los que implementan IEnumerable.

13

Es very likely to be faster (no debe elegir uno sobre el otro por el mero hecho de las pequeñas ventajas de rendimiento, a menos que usted está tratando con número computacionalmente pesado crujido o aplicación de gráficos y lo que necesita para obtener el máximo rendimiento de ciclos de procesador) y se puede pasar directamente a los delegados que lo que puede ser conveniente en algunos casos:

list.ForEach(Console.WriteLine); // dumps the list to console. 
+0

Muy interesante leer. Voy a +1 cuando pueda, sin votos por ahora :) –

+3

¿Alguien más ha notado que el tipo está haciendo * 10 MILLONES * de iteraciones? ¿Y hablando de ahorros de .03 segundos? En el punto donde estás haciendo el trabajo real dentro de esas iteraciones, ¿es probable que esos .03 segundos importen? –

+4

Kyralessa: El punto no es si importa o no. Hay una diferencia técnica entre los dos que podría importar para algunas personas. Eso es todo lo que importa para responder esta pregunta. –

Cuestiones relacionadas