Bir dizinin tüm elemanları üzerinde bir aksiyon gerçekleştirmemiz gerektiğinde, sıklıkla şu üç yoldan birini kullanırız;
- For döngüsü
- ForEach Döngüsü
- List generic sınıfının ForEach extension method’u
Şimdi basit bir örnek ile bu üç yöntemi karşılaştıralım (*);
(* Not : Karşılaştırmalar; Windows7 64bit kurulu, Core2Duo 3.0 GHz ve 4 GB Ram’li bilgisayarımda yapılmıştır. Sadece fikir verme amaçlıdır, farklı durumlarda faklı sonuçlar ile karşılaşılabilir.)
Öncelikle parametre olarak Generic List (List<T>) alan üç tane method yazalım;
private static long ToplamFor(List<int> Liste)
{
long Sonuc = 0;
int ListeAdet = Liste.Count;
for (int iLoop = 0; iLoop < ListeAdet; iLoop++)
Sonuc += Liste[iLoop];
return Sonuc;
}
private static long ToplamForEach(List<int> Liste)
{
long Sonuc = 0;
foreach (int Rakam in Liste)
Sonuc += Rakam;
return Sonuc;
}
private static long ToplamForEachExtension(List<int> Liste)
{
long Sonuc = 0;
Liste.ForEach(Rakam => Sonuc += Rakam);
return Sonuc;
}
Aynı testi 10 defa gerçekleştirip, ortalamasını alacak bir test fonksiyonu yazalım. Yazacağımız fonksiyonu test listesinde olacak eleman adedini parametre olarak alacak;
private static void Testler(int ListeElemanAdet)
{
List<int> ForSureler = new List<int>();
List<int> ForEachSureler = new List<int>();
List<int> ForEachExtensionSureler = new List<int>();
List<int> TestVerisi = Enumerable.Range(0, ListeElemanAdet).ToList();
Stopwatch sw = new Stopwatch();
for (int iLoop = 0; iLoop < 10; iLoop++)
{
sw.Restart();
ToplamFor(TestVerisi);
sw.Stop();
ForSureler.Add(sw.ElapsedTicks);
sw.Restart();
ToplamForEach(TestVerisi);
sw.Stop();
ForEachSureler.Add(sw.ElapsedTicks);
sw.Restart();
ToplamForEachExtension(TestVerisi);
sw.Stop();
ForEachExtensionSureler.Add(sw.ElapsedTicks);
}
Console.WriteLine("For Döngüsü ({0} Eleman) : {1}", ListeElemanAdet, ForSureler.Average());
Console.WriteLine("ForEach Döngüsü ({0} Eleman) : {1}", ListeElemanAdet, ForEachSureler.Average());
Console.WriteLine("ForEach Extension ({0} Eleman) : {1}", ListeElemanAdet, ForEachExtensionSureler.Average());
}
Artık uygulamamızın test fonksiyonunu kullanacak son kod parçasını yazabiliriz;
public static void Main(string[] args)
{
Console.WriteLine("Test Başladı");
Testler(1000);
Testler(5000);
Testler(10000);
Testler(50000);
Testler(100000);
Testler(500000);
Testler(1000000);
Testler(5000000);
Testler(10000000);
Testler(50000000);
Console.WriteLine("Test Bitti");
Console.ReadLine();
}
Bakalım yaptığımız testler nasıl sonuç vermiş;

Sonuçlardan aşağıdaki tabloyu çıkarttım;
| Test Verisi |
For |
ForEach |
ForEach Extension |
| 1.000 |
71,1 |
121,5 |
79,7 |
| 5.000 |
34,3 |
92,2 |
55,6 |
| 10.000 |
70,0 |
185,1 |
110,4 |
| 50.000 |
349,3 |
918,4 |
568,3 |
| 100.000 |
715,2 |
1.902,7 |
1.159,0 |
| 500.000 |
3.583,3 |
9.379,3 |
5.600,0 |
| 1.000.000 |
7.260,4 |
18.877,9 |
11.242,8 |
| 5.000.000 |
37.927,2 |
96.096,9 |
57.845,4 |
| 10.000.000 |
74.553,5 |
192.621,6 |
115.559,6 |
| 50.000.000 |
371.698,1 |
956.394,4 |
572.776,7 |
İlk olarak 50.000 elemana kadar olan listeler için karşılaştırma yapalım;

Son olarak 50.000.000 elemana kadar olan listeler için karşılaştırma yapalım;
