Bilgeadam’da öğrencilerimden birinin sorduğu soru üzerine, bir dizinin, belli sayıda elemanlardan oluşan alt dizilere bölünmesi ile ilgili aşağıdaki uygulamayı yazdım.
Uygulama şöyle çalışıyor; rastgele kelimelerden oluşan bir dizimiz var, bu diziyi, n elemanlı alt dizilere bölmek istiyoruz.
Hemen kolları sıvayalım ve kod yazmaya başlayalım.
Öncelikle rastgele kelime oluşturma fonksiyonunu yazalım;
const string Harfler = “abcdefghijklmnopqrstuvwxyz”; Random r = new Random();
public string RastgeleKelimeUret(int HarfAdet) { char[] arrReturn = new char[HarfAdet];
Parallel.For(0, HarfAdet, iLoop => {
arrReturn[iLoop] = Harfler[r.Next(0, Harfler.Length - 1)];
});
return new string(arrReturn); }</pre>
Bu fonksiyonu C# ile Dizi Karıştırma yazımdan hatırlayacaksınız. Şimdi bu fonksiyonu kullanarak List<string> tipinde bir diziye 25 eleman dolduran kodumuzu yazalım;
List<string> BolunecekDizi = new List<string>(); Parallel.For(5, 25, iLoop => { BolunecekDizi.Add(RastgeleKelimeUret(iLoop)); });
Parallel For kullanarak Multi-Core ve Multi-Thread destekli kod yazdığımıza dikkat edelim. Bölümleme fonksiyonunu ExtensionMethod olarak yazacağız.
public static class ExtensionManager { public static List<T>[] Bolumle<T>(this List<T> Dizi, int ParcaAdet) { if (Dizi == null) throw new Exception("Dizi boş olamaz.."); if (ParcaAdet < 1) throw new Exception("Parça Adet 1'den küçük olamaz.."); int DiziBoyu = (int)Math.Floor(Dizi.Count / (double)ParcaAdet) + 1; List<T>[] arrReturn = new List<T>[DiziBoyu]; int Adim = 0; Parallel.For(0, Dizi.Count, iLoop => { if (iLoop % ParcaAdet == 0 && iLoop > 0) Adim += 1; if (arrReturn[Adim] == null) arrReturn[Adim] = new List<T>(); arrReturn[Adim].Add(Dizi[iLoop]); }); return arrReturn; } }
Artık tek yapmamız gereken List<T> generic tipinde nesnelerde Bolumle() fonksiyonunu kullanmak olacak.
List<string>[] Bolumler = BolunecekDizi.Bolumle(3); Uygulamanın kaynak kodlarını buradan indirebilirsiniz.
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484