C# ile Dizi Bölümleme

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.

İlgili diğer makaleler

blog comments powered by Disqus

Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı