arş. gör. mehmet cem bÖlen...2015/12/12  · değerinin anahtarı 1907’dir ve 1907 anahtarı...

14
ÜNİTE 12 KOLEKSİYONLAR HEDEFLER • 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 İÇİNDEKİLER Koleksiyon Tanımı • ArrayList Sınıfı Hashtable Sınıfı • List Sınıfı • Stack Sınıfı • Queue Sınıfı

Upload: others

Post on 14-Jul-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Arş. Gör. Mehmet Cem BÖLEN...2015/12/12  · değerinin anahtarı 1907’dir ve 1907 anahtarı kullanılarak Fenerbahçe elemanına erişilebilir. Bununla birlikte eşsiz anahtarlar

Ü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ı

Page 2: Arş. Gör. Mehmet Cem BÖLEN...2015/12/12  · değerinin anahtarı 1907’dir ve 1907 anahtarı kullanılarak Fenerbahçe elemanına erişilebilir. Bununla birlikte eşsiz anahtarlar

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.

Page 3: Arş. Gör. Mehmet Cem BÖLEN...2015/12/12  · değerinin anahtarı 1907’dir ve 1907 anahtarı kullanılarak Fenerbahçe elemanına erişilebilir. Bununla birlikte eşsiz anahtarlar

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.

Page 4: Arş. Gör. Mehmet Cem BÖLEN...2015/12/12  · değerinin anahtarı 1907’dir ve 1907 anahtarı kullanılarak Fenerbahçe elemanına erişilebilir. Bununla birlikte eşsiz anahtarlar

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.

Page 5: Arş. Gör. Mehmet Cem BÖLEN...2015/12/12  · değerinin anahtarı 1907’dir ve 1907 anahtarı kullanılarak Fenerbahçe elemanına erişilebilir. Bununla birlikte eşsiz anahtarlar

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.

Page 6: Arş. Gör. Mehmet Cem BÖLEN...2015/12/12  · değerinin anahtarı 1907’dir ve 1907 anahtarı kullanılarak Fenerbahçe elemanına erişilebilir. Bununla birlikte eşsiz anahtarlar

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.

Page 7: Arş. Gör. Mehmet Cem BÖLEN...2015/12/12  · değerinin anahtarı 1907’dir ve 1907 anahtarı kullanılarak Fenerbahçe elemanına erişilebilir. Bununla birlikte eşsiz anahtarlar

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.

Page 8: Arş. Gör. Mehmet Cem BÖLEN...2015/12/12  · değerinin anahtarı 1907’dir ve 1907 anahtarı kullanılarak Fenerbahçe elemanına erişilebilir. Bununla birlikte eşsiz anahtarlar

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.

Page 9: Arş. Gör. Mehmet Cem BÖLEN...2015/12/12  · değerinin anahtarı 1907’dir ve 1907 anahtarı kullanılarak Fenerbahçe elemanına erişilebilir. Bununla birlikte eşsiz anahtarlar

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ü>()

Page 10: Arş. Gör. Mehmet Cem BÖLEN...2015/12/12  · değerinin anahtarı 1907’dir ve 1907 anahtarı kullanılarak Fenerbahçe elemanına erişilebilir. Bununla birlikte eşsiz anahtarlar

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.

Page 11: Arş. Gör. Mehmet Cem BÖLEN...2015/12/12  · değerinin anahtarı 1907’dir ve 1907 anahtarı kullanılarak Fenerbahçe elemanına erişilebilir. Bununla birlikte eşsiz anahtarlar

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.

Page 12: Arş. Gör. Mehmet Cem BÖLEN...2015/12/12  · değerinin anahtarı 1907’dir ve 1907 anahtarı kullanılarak Fenerbahçe elemanına erişilebilir. Bununla birlikte eşsiz anahtarlar

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.

Page 13: Arş. Gör. Mehmet Cem BÖLEN...2015/12/12  · değerinin anahtarı 1907’dir ve 1907 anahtarı kullanılarak Fenerbahçe elemanına erişilebilir. Bununla birlikte eşsiz anahtarlar

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.

Page 14: Arş. Gör. Mehmet Cem BÖLEN...2015/12/12  · değerinin anahtarı 1907’dir ve 1907 anahtarı kullanılarak Fenerbahçe elemanına erişilebilir. Bununla birlikte eşsiz anahtarlar

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.