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