ASP.NET
Network Akademi

Met Hostimg

“Bilgi paylaşıldıkça artar” sloganı ile .NET Platformuna ilişkin birikimlerin paylaşıldığı ASP.NET.TR Topluluğunda sizde “YAZAR” olmak için ; info@asp.net.tr e-mail adresine kendinizi anlatan bir e-mail göndererek başvuruda bulunabilirsiniz.

Collections ( Kolleksiyonlar )

Mahmut TEMUR
C#.NET
17.08.2011 04:57:43
Hit : 2821

Merhaba arkadaşlar;

Dinamik listeler için .NET Framework System.Collections namespace'inde bulunan ArrayList ve System.Collection.Generic namespace'indeki List<T> class'larını sunmakta. Kullanım bakımından List<T> class'ı,   ArrayList   class'ına çok benzer. List<T> class'ı IList, ICollection ve IEnumerable interface'lerine uygulanır.

Liste nesnelerin varsayılan Constructor'u çağırarak aratabiliriz. Jenerik List<T> class'ında değerler için, değer tipini belirtmelisiniz. ArrayList ise elemanları için herhangi bir Object tipini alan jenerik olmayan bir listedir.



Varsayılan Constructor'ı kullandığımız anda boş bir liste oluşur ve elemanları listeye eklediğimiz anda, listenin kapasitesi 4 elaman eklenmesine yeterli olacak şekilde genişletilir.  4 den fazla eleman eklenmesi durumunda örneğin 5. elemanı eklediğimiz anda listenin boyutu 8 eleman eklenecek kadar genişler ve 9. elemanda ise bu genişlik 16 elemanlık bir boyuta ulaşır. Yani büyüklük sürekli olarak birönceki boyutun iki katı olarak genişletilir. Bu işlem List<T> uygulamasıyla T tipinde bir dizi kullanılır. Dizinin boyutu değiştiğinde yeni bir bellek bloğu açılır ve Array.Copy() elemanları eski diziden yeni diziye kopyalar. Tabi bu durumda dizinin boyutunu önceden biliyor olmamız bize avantaj sağlayacaktır.



Bu noktada Capacity property'si sayesinde kolleksiyonun kapasitesini düzenleyebiliriz. Fakat bu noktada hemen belirtmeliyimki kolleksiyonun kapasitesi, kolleksiyondaki eleman sayısını temsil etmemektedir. Kolleksiyondaki eleman sayısına Count property'siyle ulaşabilmekteyiz. Listeye eleman eklenmediği sürece Count değeri 0'dır.



Şimdi bu noktada aklınıza hemen "Peki listeye tüm elemanları ekledik ve listedeki kullanılmayan kapasite ne olacak ?" gibi bir sorunun geldiğini tahmin ediyorum. Eğer öğe sayısı kapasitenin %90'ından daha düşükse TrimExcess metodu ile kullanılmayan bu gereksiz kapasiteden kurtulabiliriz.



Kolleksiyondaki her bir öğeye ayrı ayrı ulaşmak için for döngüsü kullanabiliriz ve Count property'siyle listede bulunan elman sayısını elde edebiliriz.



List<T>, IEnumerable interface'ini uygulandığından dolayı foreach döngüsü ilede elemanlar boyunca dönebiliriz.



List<T> class'ı Foreach ifadesine alternatif olarak Action<T> parametresi ile bildirilen bir ForEach() metodunu sunar.ForEach() kolleksiyondaki her eleman boyunca yineleme yapar ve her eleman için parametre olarak aktarılan metodu çalıştırır.



Yine Console.WriteLine() metodunun aşırı yüklemesi parametre olarak Object aldığından dolayı bu metodu ForEach metoduna aktarabiliriz. Böylelikle kolleksiyondaki her eleman konsola yazılmış olur.



Ekstra olarak anonim metot olarakta yazabiliriz.Örneğin parametre olarak Kitap nesnesi alan bir anonim metot yazabiliriz.  .




Listeye elemanları eklemek için Add() metodunu kullanmaktayız.



Instance'ı oluşturulmuş jenerik tip, Add() medyodu ile kullanılan parametrenin tipini belirler. Şimdi bu konuyu bir örnek üzerinden inceleyelim. Örneğin Kitap isimli bir listemiz olsun ve Kitaplar ismiyle Kitap için bir instance oluşturalım. Kitabımızın ad ve yazar değerleri olsun. Kitaplar değişkeni List<Kitap> tipi olarak tanımlanır. new operatörü ile Kitap tipinde yeni bir nesne oluşturulur. List<T> class'ının Kitap class'ıyla instance'ı oluşturulduğundan dolayı Add() metodu ile sadece Kitap nesneleri eklenebilir.


Tabi yukarıdaki örnekte elemanları tek tek ekleyebilmekteyiz. Eğer çoklu olarak kayıt eklemek istiyorsak List<T> class'ının AddRange() metodundan faydalanmaktayız. AddRange() metodu IEnumerable<T> tipli bir nesne aldığından bir diziyi ekleyebiliriz.





AddRange() metodu gibi gerçekleştirebileceğimiz bir diğer işlemse; eğer herhangi bir listenin instance'ını oluştururken listeye eklenecek elemanları biliyorsak class'ın constructor'ına IEnumerable<T> interface'ını uygulayan bir nesneyide aktarabiliriz.



Inert() metodu ile elemanları istediğimiz konuma aktarabiliriz.


Insert() metodunda yukarıdada gördüğümüz üzere kaydolunacağı index numarasını ve sonrasında ise elemanı eklememiz gerekmektedir.



IList ve IList<T> interface'ini uygulayan bütün class'lar bir index numarası kullanılar ve bu index numarası sayesinde o listenin elamanlarına ulaşabiliriz. İndex numaraları 0 dan başlar.



Kolleksiyondan elemanları çıkarmak için RemoveAt() metodundan faydalanabiliriz. Bu metot ile elemanı indexleyerek yada aktararak çıkartmaktayız. Örneğin Kitaplar.RemoveAt(3) dersek dördüncü elemanı çıkartmış oluruz.


Burada bir Kitap nesnesini çıkartmak için elemanı doğrudan Remove() metoduna da aktarabiliriz. Indexleyerek çıkartma işlemi daha hızlı sonuç verir. Çünkü Remove() metodunda çıkartmak istediğimiz elemanı kolleksiyonda  IndexOf() metodu ile indexini arar. Bulunan index numarasını elemanı silmek için kullanır. IndexOf() metodu ilk olarak öğenin tipinin IEquatable interface'ini uygulayıp uygulamadığını kontrol eder. Eğer bu interface uygulanmışsa metoda aktarılan elemanlardan  herhangi biri ile aynı olan elemanı kolleksiyonda bulmak için bu interface'in Equals() metodu etkinleştirilir. Eğer bu interface uygulanmışsa elemanları karşılaştırmak için Object class'ının Equals() metodu kullanılır. Object class'ının Equals() metodunun varsayılan uygulaması değer tipleriyle bit tabanlı bir karşılaştırma yapar fakat referans tipleriyle sadece referansları karşılaştırılır.

Yine RemoveRange() metodu ile de birden çok elemanı kolleksiyondan  çıkartabiliriz. RemoveRange() metodu iki parametre alır ve ilk parametrede çıkartılması istenilen elemanlar için başlangıç index ini verir. İkinci parametre de ise çıkarılması gereken eleman sayısını belirtir.



Kolleksiyonlar ile ilgili olarak anlatılması gerekenler elbetteki buradakiler ile sınırlı değil. Anlatılması gereken daha çok şey var diyebiliriz. Fakat şimdilik bu makaleyi burada sonlandırmak istiyorum. Kolleksiyonlar ile ilgili anlatımlara diğer makalelerde devam ediyor olacağım.

Faydalı olması dileğiyle kalın sağlıcakla....

Mahmut TEMUR

http://www.mahmuttemur.com
e-posta : mahmuttemur@windowslive.com




BU İÇERİĞE YORUMDA BULUNUN


Bu MAKALE'ye yorum yapabilmek için Üye olmalısınız ...!


BU İÇERİĞE YAPILAN YORUMLAR