arş. gör. mehmet cem bÖlen...2015/12/12 · değerinin anahtarı 1907’dir ve 1907 anahtarı...
TRANSCRIPT
ÜNİTE
12
KOLEKSİYONLAR
HED
EFLE
R
• Bu üniteyi çalıştıktan sonra;
• Koleksiyon tanımlayabilecek,
• Koleksiyonları sınıflandırabilecek,
• Koleksiyon arayüzlerini tanıyabilecek,
• Genel ve özel amaçlı koleksiyon sınıflarını anlayabilecek,
• Koleksiyon sınıfları üzerinde işlemler yapabileceksiniz.
NESNE TABANLI
PROGRAMLAMA - I
Arş. Gör. Mehmet Cem
BÖLEN
İÇİN
DEK
İLER
• Koleksiyon Tanımı
• ArrayList Sınıfı
• Hashtable Sınıfı
• List Sınıfı
• Stack Sınıfı
• Queue Sınıfı
Koleksiyonlar
Atatürk Üniversitesi Açıköğretim Fakültesi 2
GİRİŞ
Programlamada duyulan en temel ihtiyaçlardan biri verileri gruplayarak
saklamaktır. Hatta çoğu zaman farklı tiplerde bir grup nesne veya veri grubuyla
çalışmamız gerekebilir. Böyle bir durumda Microsoft Visual Studio.Net’in sunmuş
olduğu çeşitli koleksiyonları, sınıflarını kullanarak aynı ya da farklı türden verileri
saklayıp ve organize edebiliriz.
Koleksiyonlar amaç olarak dizilere benzese de gerek verilerin saklanmasında
gerekse bu verilere erişilmesinde dizelere göre çeşitli farklılıklar sunar. Bu
farklılıkların başında barındırdığı çok çeşitli sınıflar gelmektedir. Bu sınıflar
programcılara nesne grupları ve veriler üzerinde çalışmak üzere daha esnek bir yol
sağlar.
Bu bölümde Visual Studio.Net’te en sık kullanılan koleksiyon sınıflarına ve
özelliklerine değinilecek, C# dilinde yazılan çeşitli kod örnekleri ile bu sınıfların
kullanımı incelenecektir.
KOLEKSİYON TANIMI
C++, Java ve .Net’teki kullanım amacı düşünüldüğünde koleksiyon, aynı ya
da farklı türden birden fazla veriyi veya nesneyi bir arada tutup, bunlara erişimi
sağlayan bir sınıf olarak tanımlanabilir. Bu tanımdan hareketle koleksiyonların
kullanım amacının dizilerle benzediği düşünülse de aralarında temel farklılıklar
bulunmaktadır. Bu temel farklılıklardan en önemlisi koleksiyonların dizilerden farklı
olarak farklı türden verileri de saklamaya imkân tanımasıdır. Tablo 12.1’de Visual
Studio.Net’te diziler ve koleksiyonlar arasındaki temel farklılıklar görülmektedir.
Tablo 12.1. Dizi ve Koleksiyon Arasındaki Temel Farklar
Diziler Koleksiyonlar
System.Array isim alanı altında yer alır.
System.Collections isim alanı altında yer alır.
Sadece aynı türdeki verileri saklar. Aynı veya farklı türdeki verileri saklayabilir.
İçerdiği elemanlar herhangi bir dönüşüm işlemine tabi tutulmaz.
İçerdiği elemanlar dönüşüme (kutulamaya) tabi tutulabilir (boxing ve unboxing).
Tanımlama için new anahtar sözcüğü kullanılmak zorunda değildir.
new anahtar sözcüğü koleksiyon ismi ile kullanılmalıdır.
Diziler çok boyutlu olabilir. Koleksiyonlar doğrulsaldır,çok boyutlu olamazlar.
C++ dilinde konteyner,
Java dilinde ise
Collections Framework
olarak adlandırılan
koleksiyon tabanlı
sınıflar, C#’ta ise
koleksiyon olarak
adlandırılmaktır.
Koleksiyonlar
Atatürk Üniversitesi Açıköğretim Fakültesi 3
System.Collections isim alanı altında birçok arayüz mevcuttur. Bu arayüzler
ile koleksiyon sınıflarınınn genel karakteristiği tanımlanır. Örneğin koleksiyon
sınıfları arasında en çok kullanılan ArrayList, IList arayüzünü uygulamaktadır ve bu
yüzden bazı programcılar tarafından liste tipi koleksiyon olarak adlandırılmaktadır.
IDictionary arayüzünü kullanan HashTable koleksiyonu da birçok kişi tarafından
sözlük tipi koleksiyon olarak sınıflandırılmaktadır. Arayüzlerle ilgili bir başka önemli
nokta da koleksiyon sınıflarında ortak olan bazı özelliklerin uygulanan arayüzler
tarafından belirlenmesidir. Örneğin anahtar-değer çiftleri mantığı ile çalışan
HashTable ve SortedList sınıfları IDictionary arayüzünü uygulamaktadır. Bütün bu
sebeplerden ötürü System.Collections isim alanının altındaki arayüzlerin bir kısmını
genel hatlarıyla bilmek yararlı olacaktır. Aşağıda koleksiyon sınıflarının uyguladığı
bazı arayüzler hakkında kısaca bilgi verilmiştir.
Tablo 12.2. Bazı Koleksiyon Sınıfı Arayüzleri
Arayüz Açıklama
ICollection System.Collections altında bulunan tüm koleksiyonların sahip olduğu temel özellikleri ve metodları içerir.
IEnumerable İçinde GetEnumerator() metodunu barındırır ve bu metod ile bir koleksiyon sınıfında ilerlemek için gerekli olan numaralandırıcı sağlanır.
IEnumerator Birden fazla eleman olan koleksiyonlarda her bir elemana erişmeyi ve içeriğin elde edilmesini sağlar.
IComparer İki nesneyi karşılaştıran bir metod içerir.
IDictionary Anahtar-değer çifti mantığı ile çalışan koleksiyon sınıfları tarafından uygulanır.
IList Koleksiyondaki elemanların her birine indeks numarası ile erişilmesini sağlar.
C#’ın sunmuş olduğu hazır koleksiyon sınıfları dışında programcı ihtiyaçları
doğrultusunda kendi yazdığı farklı koleksiyon sınıfları da oluşturabilir. Bu
koleksiyon sınıfları farklı arayüzleri barındırabilir ve amaca göre özelleşebilir. Bu
yüzden C# tarafından hazır olarak sunulan ya da programcının kendi oluşturduğu
her koleksiyon türünün belirli bir amaca göre tasarlandığı söylenebilir. Farklı
amaçlar için geliştirilen koleksiyonlar farklı yapılara sahip olacağı için kendi
içerisinde gruplandırılmıştır. Genel kabule göre Generic, Non Generic ve Specialized
(Özelleştirilmiş) olmak üzere koleksiyonlar 3 gruba ayrılmaktadır. Konu temel
seviyede anlatılacağından Generic ve Non-Generic türleri incelenecektir.
NON GENERIC KOLEKSİYONLAR
System.Collections ad alanında yer alan non generic koleksiyon sınıflarının
temel özelliği farklı türdeki verilerin object türüne çevrilerek saklanabilmesidir. Bu
bölümde Non Generic koleksiyonlar arasında en sık kullanılan ArrayList, Hashtable
ve SortedList sınıfları incelenecektir.
Koleksiyonlar
tanımlanırken içereceği
eleman sayısı
belirtilmeyebilir. Bu
durumda koleksiyonun
bellekte kapladığı alan
içerdiği eleman sayısına
göre otomatik olarak
belirlenir.
Koleksiyonlarla
çalışırken using deyimi
System.Collections isim
alanı (namespace)
çağrılmalıdır.
Koleksiyonlar
Atatürk Üniversitesi Açıköğretim Fakültesi 4
ARRAYLIST
Dizilerle çalışırken karşılaşılan temel kısıtlamalar farklı türde elemanlar
barındıramaması ve çalışma zamanında dizi boyutunun dinamik şekilde
düzenlememesidir. Dizilerin bu sınırlılıklarını ortadan kaldırmak için programcılar
tarafından en sık kullanılan koleksiyon sınıflarından biri de ArrayList sınıfıdır.
ArrayList sınıfı kullanılarak farklı türlerde değişkenler saklanabilir ve çalışma
zamanında dizinin boyutu değiştirilebilir. Bu sağlanan esneklikler haricinde C#’ta
kullanımı klasik dizilerle hemen hemen aynıdır. Aşağıdaki örnekte bir ArrayList
nesnesinin tanımı görülmektedir.
ArrayList sınıfı birçok metoda sahiptir. Bu metotlar ile eleman ekleme,
çıkarma, sıralama, kopyalama gibi birçok işlem gerçekleştirilebilir. Tablo 3’te
ArrayList’in en çok kullanılan metodlarının isimleri ve işlevleri görülmektedir.
Tablo12.3. ArrayList sınıfına ait bazı metodlar
Metod Adı Açıklama
Add ArrayList içerisine eleman eklemek için kullanılır. Add metodu geriye eklenen elemanın sıra numarasını gönderir.
Clear ArrayList nesnesinin bütün elemanlarını siler ve eleman sayısı 0 olur.
Contains ArrayList içerisinde arama yapmak için kullanılır. Tek parametre kabul eder ve bu parametrede verilen object tipindeki değerin, ArrayList elemanları arasında bulunup bulunmadığını true ya da false olarak geri döndürür.
CopyTo ArrayList nesnesinin içerdiği elemanların başka bir koleksiyona kopyalanması için kullanılır.
Insert Insert metodu kullanılarak ArrayList’in sonuna eleman eklenir.
Remove Parametre olarak değeri verilen elemanı ArrayList’ten çıkarır.
RemoveAt Parametre olarak indeks numarası verilen elemanı ArrayList’ten çıkarır.
Reverse ArrayList’in içeriğini terse çevirmek için kullanılır.
Sort ArrayList elemanlarını sıralamak için kullanılır.
Yukarıda verilen metodların birçoğu ile farklı .Net sınıfları ile çalışırken
karşılaşabilirsiniz. Bunun sebebi aynı arayüzü uygulayan sınıfların, bu ortak arayüze
ait sınıf ve metodları kullanabilmeleridir. Örneğin Clear() metodu hem dizide hem
de ArrayList’te kullanılan bir metoddur. Bunun sebebi IList arayüzünü hem dizilerin
hem de ArrayList sınıfının ortak olarak uygulamasıdır. Bir diğer ifadeyle bazı metot
ve özelliklerin birden fazla sınıfta ortak olmasının sebebi, bu sınıfların aynı
arayüzleri uygulanmasındandır.
ArrayList elemanlarına
erişmek için indeks
numarası kullanılır.
İndeks numarası
dizilerde olduğu gibi
0’dan başlar.
Koleksiyonlar
Atatürk Üniversitesi Açıköğretim Fakültesi 5
Koleksiyonları kullanırken en sık yapılan işlemlerden biri de eleman eklemek
ve silmektir. ArrayList koleksiyonlarında bu işlem Add() metodu ile sağlanır. Add
metodunun kullanımında şu yapı kullanılır:
Aşağıdaki örnekte ArrayList sınıfına ait Add metodunun örnek kullanımı
görülmektedir.
Örnekte görüldüğü üzere Add metodu kullanılarak sehirler isimli ArrayList
koleksiyonuna Erzurum, İstanbul ve Ankara değerlerine sahip 3 eleman
eklenmiştir. Eklenenen elemanlar aynı tipte oldukları için aslında burada ArrayList
yerine dizi (Array) kullanımı da tercih edilebilirdi. Ancak aşağıdaki örnekte olduğu
gibi farklı tipteki elemanları birarada tutmak gerekirse bu sefer ArrayList kullanımı
kaçınılmaz olacaktır.
Yukarıdaki örnekte sehirler isimli ArrayList nesnesine 4 farklı tipte değer
içeren eleman eklenmiştir. Kod çalıştırıldığında string, int, double ve bool tipinde
değerlere sahip elemanların ArrayList’e sorunsuz şekilde eklendiği görülecektir.
Ayrıca Insert() metodu kullanılarak da ArrayList’e eleman eklenebilir.
Bir
eys
el E
tkin
lik
• ArrayList'e ait Tablo 3'te verilen metodların her biri ile ilgilibirer örnek yapınız.
ArrayList ve
Diziler(Array) Add,
Remove, Clear gibi bazı
ortak metotlar
kullanırlar.
Add(Eklenecek Değer);
Add() ve Insert()
metodları kullanılarak
ArrayList’e eleman
eklenir.
Koleksiyonlar
Atatürk Üniversitesi Açıköğretim Fakültesi 6
HASHTABLE
Bazı durumlarda koleksiyon elemanlarına bir indeks numarası dışında farklı
bir değer ile erişilmesi istenebilir. Ya da koleksiyon elemanlarının eşsiz bir değere
sahip olması ve koleksiyon içerisinde arama yapılırken bu eşsiz değerin kullanılması
gerekebilir. Şu ana kadar anlatılan dizi (Array) ve ArrayList sınıflarında elemanlara
erişmek için int tipinde indeks numarası kullanılmış ve eleman ekleme, çıkarma
veya arama gibi özellikler bu indeks numarasına göre gerçekleştirilmiştir. İndeks
numarası kullanımı az sayıda elemana sahip koleksiyonlarda mantıklı olsa da
özellikle performansın önemli olduğu durumlarda beklentileri karşılamayabilir. İşte
bu durumda HashTable kullanımına başvurulmaktadır.
Genelde performansın önemli olduğu ve koleksiyon elemanlarına erişimde
indeks numarasından farklı olarak “bir anahtar” aracılığıyla erişilmek istenmesi
durumunda System.Collections isim alanı altında bulunan HashTable sınıfı
kullanılmaktadır. ArrayList’ten temel farkı çalışma algoritmasıdır.
HashTable’da saklanan her eleman 2 bilgiden meydana gelmektedir. Bu
bilgiler değer(value) ve anahtar(key) bilgileridir. HashTable içerisinde yer alan
değerlere(value) indeks numarası ile değil eşsiz anahtar(key) kullanılarak erişilir.
Aşağıda verilen örnekte bir HashTable tanimlanmis ve birkaç anahtar – değer çifti
eklenmiştir:
Örnekte görüldüğü üzere Add() metodu 2 parametre kabul etmektedir. Bu
parametrelerden ilki anahtar, ikincisi ise değer yerine geçer. Buna göre Fenerbahçe
değerinin anahtarı 1907’dir ve 1907 anahtarı kullanılarak Fenerbahçe elemanına
erişilebilir. Bununla birlikte eşsiz anahtarlar kullanılarak Fenerbahçe değerine sahip
eleman sayısı çoğaltılabilir. Yani bir HashTable nesnesinde sadece 1 tane 1907
anahtarlı Fenerbahçe değerine sahip eleman olabilir fakat farklı anahtarlara sahip
Fenerbahçe değerinde birden fazla eleman ekleyebiliriz.
Özetle HashTable’da anahtar değeri koleksiyon elemanlarını yönetmede
kilit öneme sahiptir. Aşağıda verilen örnekte anahtar kullanılarak takimlar
HashTable’ına eklenen elemanlara erişim yöntemi görülmektedir:
Yukarıdaki kod takimlar isimli HashTable’da 1907 anahtarına sahip
elemana erişim sağlayarak bunu MessageBox’ta göstermeyi sağlamaktadır. Kod
çalıştırıldığında MessageBox’ta aşağıdaki mesaj görüntülenecektir.
HashTable’daki anahtar
değerleri eşsiz olmalıdır
Aksi hâlde çalışma
zamanı hatası ile
karşılaşılır.
HashTable’daki
toplam eleman sayısı
Count özelliği ile
öğrenilebilir.
Koleksiyonlar
Atatürk Üniversitesi Açıköğretim Fakültesi 7
Resim12.1. MessageBox görünümü
HashTable sınıfı ArrayList sınıfı ile aynı isimli birçok metod
barındırmaktadır. Ancak HashTable’da bu metodların kullanımı ve aldıkları
parametre sayıları farklılık göstermektedir. Aşağıda verilen örnekte HashTable’dan
eleman silmeye yarayan Remove() metodunun kullanımı gösterilmiştir.
Örnekte şehir isimleri plaka kodları anahtarları olacak şekilde sehirler isimli
HashTable nesnesine eklenmektedir. Ekleme işlemi bittikten sonra Remove()
metodu ile silinecek elemanın anahtar bilgisi verilmiş ve “25” anahtar değerine
sahip eleman HashTable nesnesinden silinmiştir. Burada dikkat edilmesi gereken
Remove() metodunun parametre olarak silinecek elemanın indeks numarasını
değil, anahtar değerini almasıdır.
HashTable’da anahtar değerinin eşsiz olması zorunludur. Bir anahtar
değerinin HashTable içerisinde mevcut olup olmadığını öğrenmek için
ContainsKey() metodu kullanılır. Bu metod parametre içerisinde verilen değeri
koleksiyonda tarayarak bool tipinde bir değer döndürür. Eğer parametrede
gönderilen değer HashTable’da var ise true, yoksa false değeri döner. Bu metoda
benzeyen ve HashTable içerisinde bir değerin bulunup bulunmadığı ile ilgili kontrol
eden metod ise ContainsValue()’dur. Parametre içerisinde verilen değer HashTable
koleksiyonu içerisinde varsa true yok ise false değeri döner.
HashTable ile ilgili bilinmesi gereken bir diğer önemli noktada elemanların
sıralı bir şekilde tutulmadığıdır. Bir başka ifadeyle HashTable, sıralı bir yapıyı
desteklemez ve elemanların belirli bir sırası yoktur. Elemanlar hash kodlarına göre
dizilir ve bu HashTable’ın performasını artırır.
HashTable’da
ContainsKey() metoduna
alternatif olarak
Contains() metodu da
kullanılabilir.
Koleksiyonlar
Atatürk Üniversitesi Açıköğretim Fakültesi 8
SORTEDLIST
SortedList elemanlarını HashTable gibi anahtar/değer çifti şeklinde
saklayan ancak bunu yaparken elemanlarını alfabetik ya da büyüklük-küçüklüğe
göre sıralayıp, indeks numarası ile erişme imkânı tanıyan bir koleksiyon türüdür.
Bir başka ifade ile elemanları sıralı şekilde saklayan HashTable tanımlanabilir.
SortedList yapısında elemanlar, anahtar değerlerine göre sıralanırlar. Yani
koleksiyona eklenme veya ArrayList’teki gibi elemanın değerine göre sıralama
yapılmaz, sadece anahtar değerine göre yapılır.
HashTable ile birçok ortak metod ve özelliği bulunan SortedList, içerdiği
elemanlara indeks numarasının yanında anahtar ile de erişim sağar. SortedList
sınıfının HashTable’dan farklı olarak barındırdığı bazı önemli metodlar Tablo
12.4’te belirtilmiştir.
Tablo12.4. SortedList sınıfına ait bazı metotlar
Metod Adı Açıklama
GetByIndex Parametre olarak verilen indeks numaralı koleksiyon elemanını geri döndürür.
GetKey Parametre olarak verilen indeks numaralı koleksiyon anahtarını geri döndürür.
GetKeyList SortedList içerisindeki anahtarları IList arayüzü referansı ile geri döndürür.
GetValueList SortedList içerisindeki değerleri IList arayüzü referansı ile geri döndürür.
IndexOfKey Parametre olarak verilen anahtar değerinin koleksiyonda kaçıncı indeks numarasına denk geldiği bilgisini geri döndürür.
Aşağıda verilen örnekte SortedList koleksiyonuna eleman ekleme ve bu
elemana erişim yöntemleri görülmektedir.
Bir
eys
el E
tkin
lik • HashTable'ın diğer metot ve özelliklerini araştırınız.
• 10 elemanlı bir HashTable nesnesinin anahtar-değer çiftleriniyanyana ekrana yazdırınız.
HashTable’da farklı
anahtarlara sahip olmak
kaydıyla birden fazla aynı
değer saklanabilir.
Koleksiyonlar
Atatürk Üniversitesi Açıköğretim Fakültesi 9
Örnekte bilgisayar isimli SortedList koleksiyonuna Dell, Sony ve PC değerleri,
Notebook, Desktop ve Ultrabook anahtarları ile eklenmiştir. Sonrasında Notebook
anahtarı PC olarak güncellenmiştir. Burada dikkat edilmesi gereken köşeli
parantezlerin [] içine yazılan değerin anahtar değeri olduğudur. Bu işlem
gerçekleştirildikten sonra Dell isimli değerin anahtarı PC olacaktır. Son satırda
MessageBox’ta bilgisayar koleksiyosunundaki 0 indeks numaralı eleman ekrana
yazdırılmıştır. SortedList yapısında eleman sırası alfabetik olarak anahtara göre
belirlendiği için ilk eleman Sony, ikinci eleman Dell ve üçüncü eleman ise HP
olacaktır. Dolayısıyla GetByIndex(0) metodundan geriye Sony değeri dönecektir.
GENERIC KOLEKSİYONLAR
Generic koleksiyonlar aynı veri türünde elemanları barındıracak şekilde
tasarlanan ve bu sayede tip güvenliğini sağlayan koleksiyonlardır. Non Generic
koleksiyonlardan farkı diziler gibi tek tür elemana izin vermesi ve koleksiyonda aynı
türde elemanlar tutulacaksa kullanılır. System.Collections.Generic ad alanı altında
yer alan Generic koleksiyonlar, elemanlarını herhangi bir dönüşüme sokmadıkları
için Non-Generic koleksiyonlara göre daha performanslı çalışırlar.
Bu başlık altında Generic koleksiyonlar arasında en sık kullanılanlar arasında
yer alan List, Stack ve Queue sınıfları incelenecektir.
LIST
Aynı türde verileri saklamak için kullanılır. Tıpkı dizi tanımlamada olduğu gibi
veri türü belirtilerek tanımlanır ancak boyut ya da eleman sayısı belirtilmez. Non-
Generic bir sınıf olan ArrayList ile birçok ortak metod ve özelliği bulunmaktadır.
ArrayList’ten temel farkı içereceği elemanların türü tanımlanırken verilir ve
dolayısıyla elemanlar bir kutulama (boxing-unboxing) işlemine tabi tutulmaz. Bu
yüzden ArrayList’e göre daha performanslı çalışır.
List nesnesinin tanımlanması şu şablona göre yapılır:
Şablonda da görüldüğü üzere bir List nesnesi tanımlarken koleksiyonun
içereceği elemanların türü <> işaretleri arasına yazılır. Böylece List’in veri türü
belirlenmiş olur ve <> işaretleri arasında belirtilen tip dışında eleman kabul etmez.
Aşağıda bir List nesnesi tanımlanmış ve içerisine birkaç eleman eklenmiştir.
List sınıfını kullanmak içi
using deyimi ile
System.Collections.Generic
ad alanı çağrılmalıdır.
List<Değişken Türü> Değişken Adı= new List<Değişken Türü>()
Koleksiyonlar
Atatürk Üniversitesi Açıköğretim Fakültesi 10
Bu örnekte string tipinde ornekliste isimli bir List nesnesi oluşturulmuştur.
Oluşturulan List nesnesine Elma, Armut ve Çilek isimli 3 eleman eklenmiştir. Eğer
bu listeye int tipinde bir eleman eklenmeye çalışılırsa hata alınırdı. Bunun sebebi
List’in string tipinde tanımlanmasıdır. İşte bu özelliğinden ötürü List, tip güvenliğini
sağlar ve Generic bir koleksiyon türü olarak sınıflandırılır.
STACK (YIĞIN)
Koleksiyonlarla ilgili şu ana kadar verilen örnekler genelde basit veri ekleme,
silme ya da saklama ile ilgiliydi. Ancak koleksiyonlar sadece dizisel işlemleri
gerçekleştirmek ya da performans kazanımı için kullanılmamaktadır. Bu bölümde
inceleyeceğimiz Stack nesnesi yapay zekâ, derleyiciler ya da sistem yazılımları gibi
uygulamalarda sıkça kullanılan bir koleksiyon türüdür.
Stack, klasik son giren ilk çıkar (LIFO) yöntemini kullanan ve dinamik
büyüyebilen bir koleksiyondur. Stack’ı anlamak için öncelikle LIFO yöntemini
anlamak gereklidir. LIFO yöntemini anlamak için şu örneği düşünün. 20 kitabı üst
üste gelişigüzel şekilde dizdiniz. En baştaki kitap en son koyduğunuz kitap olacaktır.
Peki bu mantıkta en alttaki kitap hangisi olur? Elbette ilk koyulan kitaptır. Özetle
LIFO mantığında koleksiyona ilk giren eleman son çıkar, son giren ise ilk eleman
olarak çıkar. İçindeki elemanlar arasında dolaşma imkânı yoktur ve sadece en
sondaki ya da en baştaki elemana erişilebilir. Tekrar kitap örneğini düşünürsek, üst
üste koyulan kitaplardan en son koyulanı en üstte, ilk koyulanı da en altta olur.
Stack sınıfının diğer Generic koleksiyonlar ile ortak metotları bulunmaktır ve
konunun uzamaması için bu metotlar tekrar burada anlatılmayacaktır. Ancak Stack
sınıfını kullanabilmek için Push() ,Pop() ve Peek() metodlarını bilmek
gerekmektedir.
Bir
eys
el E
tkin
lik • 5 elemanlı bir List nesnesi oluşturunuz ve içerdiğielemanları for ya da for each döngüsü kullanarakListBox kontrolüne ekleyiniz.
Generic sınıflar
sayesinde tip güvenliği
sağlanır.
Koleksiyonlar
Atatürk Üniversitesi Açıköğretim Fakültesi 11
Push() metodu Stack’a eleman eklemek için kullanılır ve object türünden bir
parametre alır. Böylece Stack’a istenilen tipte eleman eklenebilir. En son eklenen
eleman Stack’in en üst sırasında durur. Pop() metodu ise Stack içerisinden eleman
okumak ve silmek için kullanılır. Pop() metodu her kullanıldığında Stack’ın en
üstündeki eleman geri döner ve Stack’tan çıkarılır. Peek() metodu ise Stack’ın en
üsteki elemanını geri döndürür ve eleman Stack’tan çıkartılmaz.
Yukarıda verilen örnekte mevsimler isimli bir Stack nesnesi tanımlanmış ve
bu nesneye 4 mevsim Push() metodu kullanılarak eklenmiştir. Sonrasında
elemansayisi isimli değişkene Count özelliği ile Stack’taki toplam eleman sayısı
aktarılmış ve for döngüsü kullanılarak Stack koleksiyonu içerisinde yer alan
elemanlar listBox eklenmiştir. Kod çalıştırıldığında aşağıdaki gibi bir listBox
görüntülenecektir.
Resim 12.2. listBox görünümü
Döngüden çıkıldıktan sonra mevsimler koleksiyonunun eleman sayısı kontrol
edildiğinde 0 döndüğü görülecektir. Bunun sebebi Pop() metodunun geri
döndürdüğü her elemanı Stack’tan çıkarmasıdır.
Koleksiyonlar
Atatürk Üniversitesi Açıköğretim Fakültesi 12
QUEUE (KUYRUK)
Klasik ilk giren ilk çıkar (FIFO) yöntemine göre çalışan Queue,
System.Collections.Generic isim alanı altındadır. Queue’de temel mantık ilk
eklenen elemanın ilk olarak çıkarılmasıdır. Bunu daha iyi anlatmak için verilen en
yaygın örneklerden biri de otobüs kuyruğudur. Otobüs kuyruğunu elemanlar,
otobüs durağını ise Queue olarak düşünün. Otobüs durağına ilk gelen kişi, kuyrukta
ilk sırada olacaktır ve dolayısıyla otobüse ilk sırada biner yani kuyruktan ilk sırada
çıkar. Queue’de de ilk eklenen eleman aynı zamanda ilk olarak çıkar. Bu yönden
bakıldığında Queue sınıfı için Stack sınıfının tersi bir çalışma şekline sahip olduğu
söylenebilir.
Queue programlamada genelde veri tabanı işlemleri, ağ trafiği yönetimi
veya simulasyonlarda kullanılmaktadır.
Bir Queue nesnesine eleman eklemek için Enqueue() metodu kullanılır.
Object tipinde tek parametre kabul eden Enqueue() metodu bu parametreyi
kuyruğun sonuna ekler. Queue içerisinden eleman silmek için ise Dequeue()
metodu kullanılır. Bu metod kuyruk içerisinde en üstte yer alan elemanı siler.
Peek() metodu ise Queue içerisidne en üst sıradaki elemanı döndürür ama silmez.
Bir başka ifadeyle Stack sınıfındaki gibi kullanılır. Aşağı verilen örnekte Queue
sınıfının ve bazı metodlarının kullanımı görülmektedir.
Örnekte sayilar isimli int eleman kabul edecek bir Queue nesnesi
tanımlanmıştır. Daha sonrasında 1, 2, 3, 4 ve 5 elemanları eklenmiş ve bu
elemanlar Dequeue metodu ile for döngüsü kullanılarak listBox’a eklenmiştir.
Kodlar çalıştırıldıktan sonra listBox aşağıdaki gibi görüntülenecektir.
Koleksiyonlar
Atatürk Üniversitesi Açıköğretim Fakültesi 13
Resim 12.3. listBox görünümü
listBox’a ilk eklenen elemanın 1 olduğu görülmektedir. Kodlar
incelendiğidne sayilar isimli Queue nesnesinede ilk eklenen elemanın 1 olduğu
görülecektir. Dolayısıyla ilk eklenen eleman ilk olarak çıkmıştır. Döngüden
çıkıldıktan sonra sayilar koleksiyonunun eleman sayısı (Count) kontrol edildiğinde 0
döndüğü görülecektir. Bunun sebebi Dequeue() metodunun geri döndürdüğü her
elemanı koleksiyondan çıkarmasıdır.
Koleksiyonlar
Atatürk Üniversitesi Açıköğretim Fakültesi 14
Öze
t•Koleksiyonlar amaç olarak dizilere benzese de gerek verilerin saklanmasında gerekse
bu verilere erişilmesinde dizelere göre çeşitli farklılıklar sunar. Bu farklılıkların başında barındırdığı çok çeşitli sınıflar gelmektedir. Bu sınıflar programcılara nesne grupları ve veriler üzerinde çalışmak üzere daha esnek bir yol sağlar.
•Koleksiyonlar dizilerden farklı olarak farklı türden verileri de saklamaya imkân tanır.
•Koleksiyonlar Non Generic ve Generic olmak üzere sınıflandırılabilir.
•Koleksiyonlar tanımlanırken içereceği eleman sayısı belirtilmeyebilir. Bu durumda koleksiyonun bellekte kapladığı alan içerdiği eleman sayısına göre otomatik olarak belirlenir.
•ArrayList sınıfı kullanılarak farklı türlerde değişkenler saklanabilir ve çalışma zamanında dizinin boyutu değiştirilebilir.
•Genelde performansın önemli olduğu ve koleksiyon elemanlarına erişimde indeks numarasından farklı olarak “bir anahtar” aracılığıyla erişilmek istenmesi durumunda System.Collections isim alanı altında bulunan HashTable sınıfı kullanılmaktadır.
•SortedList elemanlarını HashTable gibi anahtar/değer çifti şeklinde saklayan ancak bunu yaparken elemanlarını alfabetik ya da büyüklük-küçüklüğe göre sıralayıp, indeks numarası ile erişme imkânı tanıyan bir koleksiyon türüdür.
•List sınıfı aynı türde verileri saklamak için kullanılır. Tıpkı dizi tanımlamada olduğu gibi veri türü belirtilerek tanımlanır ancak boyut ya da eleman sayısı belirtilmez.
•Stack, klasik son giren ilk çıkar (LIFO) yöntemini kullanan dinamik büyüyebilen bir koleksiyondur.
•Queue Stack'ın tersi olarak düşünülebilir. Queue’de temel mantık ilk eklenen elemanın ilk olarak çıkarılmasıdır.