C# Liste vs Dizi

Merhabalar, C# derslerimize kaldığımız yerden devam ediyoruz. Bu dersimiz biraz teorik olacak. C#’da çok işimize yarayan liste ve dizi arasındaki farkları anlatacağım. Tabi örneklerle destekleyeceğiz dersimizi.
Önce dizilerden başlamak istiyorum; Öncelikle dizi oluştururken dizinin boyutunu belirtmemiz gerek, yani sabit boyutlu olması gerek. Yani “ben dizi oluşturayım, sonra istediğim zaman veri eklerim” diyemiyoruz ne yazık ki. Diziyi ilk oluştururken kaç tane eleman alacağını belirtmemiz gerek. Örneğin;
int[] dizi = new int[5];
şeklinde. Sonrasında da diziye en fazla 5 tane eleman ekleyebiliriz. Yada dizi boyutunu belirtmesek bile elemanları belirtmemiz gerekiyor. Örneğin;
int[] dizi2 = {1, 2, 3, 4, 5};
gibi. Bu örnekte belirttiğimiz dizide 5 elemanlı bi integer dizisidir. Diziler, değişkenler gibi bellekte tutulur ve belirtilen boyut kadar dizinin tipine göre bellekte o kadar yer ayrılır.
Bellek boyutu değiştirilemez. Yani az önceki örnekte 5 elemanlı integer tipinde dizi oluşturmuştuk, bu dizi bellekte 5 integer kadar yer kaplar; yani 40 bit. Dizinin ilk elemanı başlangıç elemanı, son elemanı ise bitiş elemanıdır ve her eleman bellekte kendi verisi ile beraber bir sonraki elemanın adresini tutar. Yani dizi2 isimli diziye bakarsak, başlangıç adresinde 1 ile beraber 2’nin adresi, 2’nin bulunduğu adreste 2 ile beraber 3’ün adresi gibi. Dizinin eleman sayısı pozitif tam sayılar ile belirtilse de (1, 2, 3, … gibi), index yani sıra numaraları sıfırdan başlar. Yani dizinin ilk elemanının index numarası 0, 1. elemanının index numarası 1, 2. elemanının index numarası 1, … gibi. Ve dizideki elemanlara index numaraları belirtilerek ulaşılır. Örneğin dizi2 dizisindeki 3 elemanını ulaşmak için dizi[2] kullanılır. Ayrıca diziden eleman silmek için ise ne yazık ki hazır bir fonksiyon yok, sadece kaydırma yöntemi ile silinebiliyor. Yani örneğin dizi2 isimli dizide index numarası 1 olan eleman (yani 2. eleman) silinmek istendiğinde indexi 2 olan eleman 1 numaralı indexe, 3 indexli eleman 2 numaralı indexe, 4 indexli eleman 3 numaralı indexe gibi kaydırma yapılması gerekiyor.
Dizilerden bu kadar bahsettikten sonra şimdi bide listelere bakalım. Listelerin diziler gibi oluşturulurken boyutunun belirtilmesine gerek yok, liste oluşturduktan sonra eleman ekledikçe listenin boyutu otomatik olarak artar. Siz liste oluşturduğunuzda boyutu (kapasitesi) 0’dır, 1 eleman eklerseniz kapasite 1, 2 eleman eklerseniz kapasite 2, 3 eleman eklerseniz kapasite 3 olur. Örneğin
List<int> liste = new List<int>();
ile integer tipte liste oluşturulabilir. Listeye eleman eklemek için dizilerdeki gibi index numarası belirtilerek yada tek eleman eklemek için Add(), birden fazla eleman eklemek için ise AddRange() fonksiyonu kullanılabilir. Fakat Addrange() fonksiyonunda belirtilen elemanlar listenin tipiyle aynı olan bir dizi olmalıdır. Örneğin liste isimli listeye önce 1, sonra 3 eleman ekleyelim;
liste.Add(1);
liste.AddRange(new int[] { 2, 3, 4 });
Listelerde diziler gibi bellekte tutulur ve yine aynı şekilde her eleman kendi değerine ek olarak bir sonraki elemanın adresini tutar. Listede bir elemana ulaşmak istendiğinde dizilerdeki gibi index numarası ile ulaşılmasının yanı sıra ElemenAt() fonksiyonu kullanılarak da ulaşılabilir.ElementAt() fonksiyonu da index numarası kullanır. Örneğin eklediğimiz elemanlardan 2’ye ulaşalım;
int ikinciEleman = liste[1];
int ikinciEleman = liste.ElementAt(1)
Bu 2 satırda aynı işlemi yapmaktadır, fakat dizilerden ayırmak için ElementAt() fonksiyonu daha çok kullanılıyor kendi fikrimce. Listelerin bir güzel yanı da liste içinden veri silinebiliyor, aslında arka planda dizilerdekine benzer bi kaydırma işlemi yapılıyor ama kod tarafında tek satır ile halledebildiğimiz için kod okunaklığı daha iyi oluyor 🙂 Listeden veri silmek için Remove() ve RemoveAt() fonksiyonu kullanılıyor. Remove() fonksiyonuyla liste içindeki elemanın kendisi, RemoveAt() fonksiyonuyla da elemanın index numarası kullanılarak silme işlemi yapılır. Örneğin az önceki listeden 2 ve 3 elemanlarını silelim.
liste.Remove(2);
liste.RemoveAt(1);
Şimdi diyeceksiniz ki 3 elemanının index numarası 2 ama biz 1 yazdık, neden ? Sebebi şu; Remove() fonksiyonuyla 2’yi sildiğimiz zaman 3 bir önceki indexe kayar, yani yeni index 1 olur, o yüzden 1 yazdık 🙂
Hem liste hemde diziler üzerinde Linq kodları yazılabilir. Linq kullanılarak diziler listeye, listeler ise diziye çevrilebilir. Diziyi listeye çevirmek için ToList(), listeyi diziye çevirmek için ise ToArray() fonksiyonu kullanılır. Örneğin dizi2 isimli diziyi listeye, liste isimli listeyi de diziye çevirelim.
List<int> dizi2ArtikListe = dizi2.ToList();
int[] listeArtikDizi = liste.ToArray();
Tabiki diziyi listeye çevirsekte, listeyi diziye çevirsekte tip değişmez. Yani dizi2ArtikListe isimli liste bir integer listesi, listeArtikDizi dizisi de integer dizisidir, her ikisi de sadece integer tipte veri alabilir. Her ikiside bellekte tutuluyor dedik, bellekte nasıl tutulduğunu da söyledik hatta aynı özellikleri taşıyor dedik (demedik aslında ama öyle olduğunu anlamışsınızdır :)) ama hızlarına bakacak olursak listeler daha hızlıdır fakat bellekte dizilere göre daha fazla alan kaplar ve daha fazla bellek kullanır.
E biz şimdi ne kullanacağız derseniz; projenizin boyutuna, kullanacağınız teknolojiye (mesela Entity Framework ile veritabanı işlemleri yapacaksanız liste kullanmak daha mantıklı olacaktır), verinin büyüklüğüne göre değişmektedir. Yani bazı projelerde liste, bazılarında dizi ve bazılarında ise her ikisi birlikte kullanılabilir, buna karar vermek size kalmış.
Evet bu dersimizde bu kadardı, umarım liste ve diziler arasındaki fark ve benzerlikleri doğru ve açıklayıcı bir şekilde aktarabilmişimdir. Tüm C# derslerimize buraya tıklayarak ulaşabilirsiniz. Başka bir derste görüşmek üzere, herkese hayırlı günler.