Die generische List-Klasse hat eine .ForEach(Action<T> action)
Methode. Jetzt habe ich einige einfache Timings von, wie sie beide durchführen, und es scheint, dass das generische ForEach der ärmere Darsteller ist. Der (Snippet Compiler Friendly) Code ist unter -.Net - Wann ist die Liste <T> .ForEach über eine Standard-foreach-Schleife bevorzugt?
public static class timer{
public static long foreachloop = 0;
public static long Gforeachloop = 0;}
public class something{
public List<string> myStrings = new List<string>();
public something()
{
for(int i = 1; i<=5000000;i++)
{
myStrings.Add(i.ToString());
}
}}
public class cls1{
private static List<string> Strings = new List<string>();
private static List<string> OtherStrings = new List<string>();
public static void RunSnippet()
{
something s = new something();
Stopwatch watch = new Stopwatch();
watch.Start();
foreach(string x in s.myStrings)
{
Strings.Add(x);
}
watch.Stop();
timer.foreachloop = watch.ElapsedMilliseconds;
watch.Reset();
watch.Start();
s.myStrings.ForEach(delegate(string n){OtherStrings.Add(n);});
s.myStrings.Clear();
watch.Stop();
timer.Gforeachloop = watch.ElapsedMilliseconds;
WL("FOREACH-"+timer.foreachloop + ",Count = " + Strings.Count);
WL("GFOREACH-"+timer.Gforeachloop + ",Count = " + OtherStrings.Count);
}
#region Helper methods
public static void Main()
{
try
{
RunSnippet();
}
catch (Exception e)
{
string error = string.Format("---\nThe following error occurred while executing the snippet:\n{0}\n---", e.ToString());
Console.WriteLine(error);
}
finally
{
Console.Write("Press any key to continue...");
Console.ReadKey();
}
}
private static void WL(object text, params object[] args)
{
Console.WriteLine(text.ToString(), args);
}
private static void RL()
{
Console.ReadLine();
}
private static void Break()
{
System.Diagnostics.Debugger.Break();
}
#endregion
}
FOREACH kommt bei 177ms heraus und GFOREACH bei 707ms.
Jetzt vermute ich, es gibt einen guten Grund dafür, es zu benutzen, aber ich kann nur an einen nicht denken. Natürlich ist Leistung nicht der Grund, also ist die Frage, wann wäre es die beste Option?
Vielen Dank im Voraus.
Verwandte/Dupe? http://stackoverflow.com/questions/1172472/when-would-i-use-listt-foreach-over-a-native-foreach-loop – Brandon