Koleksiyonlar - ArrayList Kullanımı

Koleksiyon Nedir?

Koleksiyonlar dizilere benzer şekilde, çok sayıda veriyi saklamaya yarayan yapılar, daha doğru bir ifadeyle nesnelerdir. Koleksiyonların içinde saklananlar da birer nesnedir. Diziler, değişkenlerde olduğu gibi bir veri tipi belirtilerek tanımlanmaktadır. Koleksiyonlar ise her türden veriyi object türünde saklarlar.

Koleksiyonlar ile diziler arasındaki farkları şu şekilde açıklayabiliriz:

  • Diziler tek tipte veri saklarlar. Tanımlanırken belirlenen tür dışında veri saklayamazlar (bkz Diziler). Koleksiyonlar ise farklı türlerdeki verileri saklayabilir. Yani 1. eleman string iken, diğeri sayı, bir diğeri boolean vb olabilir.
  • Dizilerin eleman sayısı başlangıçta belirlenir ve sonradan değiştirilemez. Koleksiyonlar ise dinamik bir yapıya sahiptir. Add ve Remove metotları ile eleman eklenip çıkarılabilir. Hatta araya eleman bile eklenebilir.

Yukarıda saydıklarımız koleksiyonların dizilere göre avantajları olarak da kabul edilebilir.

Yazacağım programda dizi mi kullanmalıyım, koleksiyon mu? Buna nasıl karar vermeliyim?

Koleksiyonların dizilere göre dezavantajı şudur: Koleksiyondaki her elemanın object türünde saklandığını söylemiştik. int, bool, double gibi değer tipindeki veriler koleksiyona eklenirken ya da alınırken dönüşüm işlemi gerekecek, koleksiyonun boyutu arttıkça yapılan dönüşüm işlemi sayısı da artacak ve uygulanamızın performansı düşecektir.

Bu nedenle hangisini kullanmalıyız sorusuna yanıt verirken ihtiyacımızın ne olduğunu iyi hesaplamalıyız. Eğer saklayacağımız verilerin hepsi aynı türde olacaksa ve eleman sayısında artma ya da azalmaya ihtiyacımız olmayacaksa kesin olarak dizileri tercih etmeliyiz.

Programcılıkta çeşitli koleksiyon türleri bulunmaktadır. Bunlardan en genel amaçlısı ArrayList sınıfıdır.

ArrayList Kullanımı

Öncelikle System.Collections sınıfının projemize dahil edilmesi gerekir:

using System.Collections;

ArrayList sınıfından üretilen bir koleksiyon nesnesinin başlangıçtaki kapasitesi 4'tür. Kapasitenin dinamik olduğunu başta belirtmiştik. Kapasite dolduğu anda otomatikman iki katına çıkarılmaktadır. Yani 5. eleman koleksiyona eklendiğinde önce kapasite 8'e çıkarılmaktadır. Benzer şekilde 9. eleman eklenirken kapasite 16'ya çıkarılır. 17. eleman eklenirken 32'ye çıkarılır ve böyle devam eder.

Koleksiyon nesnesinin üretilmesi şu şekildedir:

ArrayList listem = new ArrayList();

Yukarıdaki komut satırı sayesinde listem adında ArrayList sınıfından bir koleksiyon nesnemiz olacaktır.

Koleksiyona verileri eklemek için Add metodu kullanılır. Hangi sıra ile ekleme yaparsak elemanların index numarası o sıra ile olacaktır. Index numaraları her zaman olduğu gibi 0'dan başlar.

listem.Add("monitör");

listem.Add(458);

listem.Add(true);

Yukarıdaki gibi eklenen elemanlar farklı ya da aynı türde olabilir.

Add metodu ile eklenen eleman koleksiyonun en sonuna eklenecektir. Eğer araya yani belli bir index numarasına ekleme yapmak istersek Insert metodunu kullanabiliriz.

ArrayList listem = new ArrayList();
listem.Add("monitör");
listem.Add("harddisk");
listem.Add("cpu");
listem.Add("klavye");
listem.Add("kasa");
listem.Insert(2, "fare");

Yukarıdaki örnekte en son satırda Insert metodu kullanılmıştır. Insert metodu 2 parametre alır. İlki eklenecek elemanın index numarası, ikincisi ise eklenecek değerdir.

Örnekte "fare" verisi koleksiyonun 2 indis numaralı elemanına atanmıştır. Bu durumda 2 numaralı eleman ve ondan sonrakiler 1 ileri ötelenmiştir.

InsertRange metodu ise koleksiyonun istenilen yerine başka bir koleksiyonun elemanlarını sırası ile eklemeye yarar. Alttaki örnekte liste2 isimli koleksiyonun elemanları, liste koleksiyonuna 2 numaralı elemandan başlayacak şekilde araya eklenmiştir.

liste.InsertRange(2, liste2);

Koleksiyondan bir değeri silmek için Remove metodu kullanılır. Remove metoduna parametre olarak silinmek istenen elemanın değeri verilir. Verilen değere sahip birden fazla eleman varsa sadece ilk bulunan yani indis numarası daha küçük olan silinir. 

listem.Add("monitör");
listem.Add("harddisk");
listem.Add("cpu");
listem.Remove("harddisk");

Yukarıdaki örnekte harddisk değerine sahip olan eleman silinmiştir. Silinen elemandan sonra gelen elemanların indis numaraları 1 geriye kayacaktır.

Remove ile silme yapıldığında koleksiyonun eleman sayısı azalacak ancak kapasitesi değişmeyecektir. 

Eğer silme işlemini elemanın index numarasına göre yapmak istersek RemoveAt metodunu kullanabiliriz. RemoveAt metodu parametre olarak silinecek elemanın indis numarasını alır. Örneğin 5 numaralı elemanı silmek için:

listem.RemoveAt(5);

Belirli bir index numarasından itibaren çok sayıda elemanı silmek içinse RemoveRange metodunu kullanırız. Bu metot iki parametre alır. İlki silmeye başlanacak elemanın index numarası, ikincisi ise kaç tane elemanın silineceğidir.

listem.RemoveRange(4,3);

Yukarıdaki satır ile koleksiyonun 4 numaralı yani beşinci elemanından itibaren 3 tane eleman silinmiştir.

Bir koleksiyonun tüm elemanlarını bir kerede silmek istersek Clear metodunu kullanabiliriz.

listem.Clear();

Koleksiyondaki tüm elemanlar ile işlem yapmak için foreach ya da for döngüsü kullanabiliriz. Burada dikkat edilmesi gereken şey object türündeki elemanların istenen tipe dönüştürülürken hata olabileceğidir.

Bir koleksiyonun tüm elemanlarını label1 içerisine alt alta yazdırmak istersek:

foreach (string a in liste)
       label1.Text += a + "\n";

Aynı işi for döngüsü ile de yapabiliriz:

for(int i=0; i<liste.Count;i++)
        label1.Text += liste[i] + "\n";

Burada kullanılan Count özelliği ile koleksiyonun eleman sayısı elde edilmiştir. Döngü içerisinde liste[i] şeklinde koleksiyonun i numaralı elemanına ulaşılmıştır. Index numaraları 0'dan başladığı için eleman sayısından 1 önce döngünün sonlanması sağlanmıştır.

Koleksiyonun kapasitesini öğrenmek için Capacity özelliği kullanılır.

label1.Text = liste.Capacity.ToString();

Bir koleksiyonun tüm elemanlarını başka bir koleksiyona eklemek için AddRange metodu kullanılır. Aşağıdaki örnekte liste2 isimli koleksiyonun tüm elemanları, liste1'in sonuna eklenmiştir.

liste1.AddRange(liste2);

Contains metodu ile koleksiyonun içinde bir değerin bulunup bulunmadığını anlayabiliriz. Aşağıdaki örnekte liste isimli koleksiyonun içinde değeri "Ahmet" olan bir eleman varsa sonuç true, yoksa false dönecektir.

if ( liste.Contains("Ahmet") )
       label1.Text = "Aranan İfade Bulundu.";
else
       label1.Text = "Bulunamadı.";

IndexOf metodu ile aranan bir veri koleksiyon içinde bulunduğu taktirde o elemanın index numarası elde edilebilir.

int siraNo = liste.IndexOf("Ali");

LastIndexOf metodu da IndexOf gibi çalışır. Ancak aranan veri birden fazla geçiyorsa en sonuncusunun index numarasını verir.

int siraNo = liste.LastIndexOf("Ali");

CopyTo metodu ile koleksiyonun elemanlarını uyumlu türdeki bir diziye kopyalayabiliriz. Aktarılacak elemanların türleri hedef dizi ile aynı olmazsa hata verecektir. Ayrıca hedef dizinin uzunluğu (length) da bu işlem için yeterli olmalıdır. Alttaki örnekte 12 elemanlı string türünde bir dizi oluşturulmuş ve liste isimli koleksiyonun tüm elemanları bu diziye aynı sıra ile kopyalanmıştır.

string[ ] dizi1 = new string[12];
liste.CopyTo(dizi1);

CopyTo metodu birkaç şekilde kullanılabilir (aşırı yüklenmiş metot). liste.CopyTo( dizi1, 2) şeklindeki bir kullanım ile koleksiyondaki elemanların dizinin 2 numaralı elemanından başlanarak kopyalanması sağlanabilir. 

Ayrıca şu şekilde de 4 parametre alacak şekilde de kullanılabilir:

liste.CopyTo( koleksiyonIndexNo, diziAdı, diziIndexNo, kopyalanacakElemanSayısı);

Bu tür bir kullanım ile koleksiyonun belirtilen numaralı elemanından başlanarak istenen sayıda elemanın, dizinin istenen yerine kopyalanması sağlanabilir.

liste.CopyTo(3,dizi1,2,4);

GetRange metodu ile bir koleksiyonun bir kısmı başka bir koleksiyona atanabilir. Aşağıdaki örnekte liste1 koleksiyonunun ilk 4 elemanı liste2 koleksiyonuna atanmıştır.

ArrayList liste1 = new ArrayList();
liste1.Add("Manisa");
liste1.Add("Ankara");
liste1.Add("İzmir");
liste1.Add("Çankırı");
liste1.Add("Muğla");
liste1.Add("Hatay");
 
ArrayList liste2 = new ArrayList();
 
liste2 = liste1.GetRange(0, 4);

Reverse metodu ile bir koleksiyonun elemanlarının sırası değiştirilebilir, bir diğer ifade ile ters çevrilebilir.

liste.Reverse();

Reverse metodu iki parametre alacak şekilde kullanılarak koleksiyonun sadece belli bir kısmının ters çevrilmesi de sağlanabilir.

liste.Reverse( 4, 5 );

Yukarıdaki kod satırı ile liste koleksiyonunun 4 numaralı elemanından itibaren toplamda 5 eleman kendi içerisinde tersten sıralanacaktır.

Sort metodu ile koleksiyonun tüm elemanları artan şekilde sıralanabilir. 

liste.Sort();

 

c# koleksiyon kullanımı, koleksiyon nedir, koleksiyon ile dizinin farkı, koleksiyonlar ile dizilerin farkları, arraylist kullanımı, arraylist kullanmanın avantajları, arraylist nasıl kullanılır, using collections and arraylist, differences between collections and array

KONU İLE İLGİLİ ÖRNEKLER

Bu konu ile ilgili örnek bulunmamaktadır.



YORUMLAR




619  kez okundu.

Online Kullanıcı Sayısı 37