C# TA ARRAYLİST YAPISI

Yayınlandı: Haziran 17, 2010 / C#
Etiketler:, , , , ,

ARRAYLIST CLASSINI BIZ YAZALIM (Add-RemoveAt-Reverse)

Merhaba arkadaslar bu makalemizde Arraylist metotlarindan Add, RemoveAt ve Reverse metotlarini kendimiz yazacagiz. 

 

Arraylistin Add metodunu Engin Hocamiz zaten daha önce yazip sitemizde yayinlamisti. Ben de Engin Hocamizin yazdigi Add metodu kullanarak bu classi gelistirdim ve Arraylistin RemoveAt ve Reverse metotlarini yazdim. Engin Hocamiz Add metodunun makalesini yazip açiklamalarini yaptigi için ben Add metodu üzerinde hiç durmayacagim. Bu metotla ilgili makaleyi asagidaki linkte bulabilirsiniz.

            Simdi kodlar üzerinden gerekli açiklamalari yapip konunun ve kodlarin daha iyi anlasilmasini saglayalim.

object[] dizi;public void ekle(object deger)         

        {

            try

            {

            object[] geciciDizi = new object[dizi.Length];

               geciciDizi = dizi;

               dizi=new object[geciciDizi.Length+1];   

                for (int i = 0; i < geciciDizi.Length; i++)  

                {

                    dizi[i] = geciciDizi[i];

                }

                dizi[dizi.Length – 1] = deger;

            }

            catch  

            {

                dizi=new object[1];

                dizi[0]=deger;

            }

        } 

    

//yukaridaki kod blogu Arraylistin Add metodudur.

      RemoveAt Metodunu Yazalim    

Arraylistin RemoveAt metodunu yazmaya baslamadan önce bu metodun ne ise yaradigindan bahsedelim. RemoveAt metodu belirtilen index numarasina göre silme islemi yapar ve Arrayliste kullanimi .RemoveAt(int index); seklindedir. Buradan da anlasilacagi gibi disaridan silinecek int türünde bir index numarasi giriyoruz. Bizde kendi kodumuzu yazarken bunlara dikkat edecegiz. Tabi diger bir dikkat edilmesi gereken husus ise listeden eleman sildigimizde listenin eleman sayisinin 1 azalacak olmasi. Simdi bu dediklerimizi kodlar halinde yazalim.

 public void sil(int indis)  //1

        {

            object [] geciciDizi2 = new object[dizi.Length-1]; //2

            int sayac = 0; //3

            for (int i = 0; i < dizi.Length; i++) //4

            {              

                if (i == indis)    

                {                 

                   continue;    //5

                }

                   geciciDizi2[sayac] = dizi[i];  //6         

                    sayac++; 

            }

            dizi = new object[geciciDizi2.Length]; //7

            for (int i = 0; i < geciciDizi2.Length; i++)

            {

               dizi[i] = geciciDizi2[i]; //8

            }

        }

       

 

//1 Dizimiz deger dondurmeyecegi için sil adinda bir prosedur tanimladik ve Prosedürün istedigimiz sekilde çalismasi için int türünde bir parametre yolladik.

//2 Bilindigi üzere C# ta dizi eleman sayisi degistirilmekistendiginde dizimizde bulunan elemanlar sifirlaniyor.

Iste Eleman sayisi azaltilmadan önce geçici bir dizitanimlayalim ki elemanlari önce buraya aktaralim. Dikkat ederseniz geçici dizinin eleman sayisini normal dizimizin eleman sayisindan 1 az olarak tanimladim. Çünkü silme islemi gerçeklestiginde eleman sayim 1 azalacak.

//3 Sifir “0” ile baslayan bir sayac tanimladik, bunu aktarma isleminde kullanacagiz.

//4 Dizideki elemanlari gecici diziye aktarmak için dizinin eleman sayisi kadar tekrarlanacak olan bir for dongusu kuruyoruz. Dikkat edelim gecici dizi kadar tekrarlanacak bir döngü kursaydim gercek dizimdeki elemanlarimin sonuncusunu gezemeyecektim. Buda sadece son elemani silmek istedigimde isime yarardi aksi takdirde arada bi eleman silmek isteseydim programi kiracakti. 

//5 Bizim için önemli olan kisim if blogu. eger dongumuz silmek istedigimiz index numarasina geldiginde o elemani pas gecmesi için continue; kullandik boylece gecici dizeye o elemani aktarmamis olduk.

//6 Dizideki elemanlari(silinen haric) gecici diziye tek tek aktariyoruz ve sayacimizida 1 er 1 er artiriyoruz ki gecici dizimizde bos eleman kalmasin

//7 Gercek dizimizi tekrar boyutlandiriyoruz.

//8 Daha sonra dongu yardimiyla gecici dizimizdeki elemanlari tek tek gercek dizimize aktariyoruz.

Reverse Metodunu Yazalim

Arraylistin Reverse metodunu yazmaya baslamadan önce bu metodun ne ise yaradigindan bahsedelim. Reverse metodu listemizdeki ilk elemani listenin son elemani olarak atar, son elemanini ise ilk elemani olarak atar. Örnek olarak asagidaki resmi inceleyebilirsiniz.

Arrayliste Reverse metodunun kullanimi .Reverse(); seklindedir.

public void tersineCevir() //9       {          

           object[] geciciDizi3 = new object[dizi.Length]; //10          

           for (int i = 0; i < dizi.Length; i++)

           {

               geciciDizi3[i]=dizi[i]; //11

           }

            int sayac=geciciDizi3.Length-1; //12

            for (int i = 0; i < geciciDizi3.Length; i++)

            {

                dizi[i] = geciciDizi3[sayac];  //13

                sayac–;    //14

            }

        }

 

//9 Herhangi bir deger dondurmeyecegi için ve disaridan herhangi bir deger atanmayacagi için tersineCevir adinda parametresiz bir prosedur tanimlamasi yaptik 

//10 Tekrar gecici bir dizi tanimlamasi yaptik.

//11 Gercek dizideki tüm elemanlari for dongusu yardimiyla tek tek gecici diziye aktardik ve gercek dizinin bir kopyasini esitleme için almis olduk.

//12 Gecici dizinin yada gercek dizinin eleman sayisinin 1 eksigi kadar bir sayac tanimliyoruz. 1 eksik tanimlamamizin nedeni dizilerin eleman sayisinin 0 dan baslamasidir, sayaci her azalttigimda dongumüz bitmeden sayacin 0 a kadar gidebilmesi için 1 eksiginden baslatiyoruz.

//13 – //14 For dongusu yardimiyla gecici dizideki elemanlari gercek diziye aktariyoruz. Yukarida resimdeki gibi 4 elemanli bir dizi dusunursek söyle olmasi gerek:

dizi[0] = dizi[3]

dizi[1] = dizi[2]

dizi[2] = dizi[1]

dizi[3] = dizi[0]

Gördügünüz gibi bir taraf artarken diger taraf azaliyor. Bunu saglamak için esitligin bir tarafi(i) hep 1 artarken(ki döngüyü zaten öyle kurduk), diger tarafinda(sayac) hep 1 azalmasi gerek. Bu nedenle sayaci 1 er 1 er azaltiyoruz.

Sonuc olarak;

MEHMET SALİH DEVECİ

YAZILIM MÜHENDİSİ

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s