C# Diziler ve Listeler

  • 2114
  • (2)
  • (5)
  • 20 Haz 2017

Diziler ve listeler C# .NET dünyasında aynı türde birden çok veriyi içerisinde tutabilen yapılardır.

Diziler (Arrays)

Herhangi bir veri türünü referans veya değer tipi olmaksızın dizi olarak tanımlayabilmektesiniz.

    
string[] metin_dizisi; // string türündeki değişkenleri içerisinde tutan dizi
int[] tamsayi_dizisi; // int türündeki değişkenleri içerisinde tutan dizi
float[] ondalik_sayi_dizisi; // float türündeki değişkenleri içerisinde tutan dizi
    

Tanımlanan dizilere ilk değer atama işlemi aşağıdaki gibi yapılır. new anahtar kelimesinin kullanılma amacı dizilerin birer referans türü olmasından kaynaklıdır.

    
string[] isimler = new string[6]; // 6 elemanlı dizi tanımlanır
isimler[0] = "İsim 1";
isimler[1] = "İsim 2";
isimler[2] = "İsim 3";
isimler[3] = "İsim 4";
isimler[4] = "İsim 5";
isimler[5] = "İsim 6";

isimler[6] = "İsim 7"; // IndexOutOfRangeException hatası alınır
    

6 elemanlı bir dizinin minimum indisli elemanı 0' da maksimum indisi ise 5' tedir.

Dizilerin referans türü olduğunu daha iyi anlamak için aşağıdaki kodu mutlaka uygulayın. Dizilerin uzunluğunu Length özelliği ile elde edebilirsiniz.

    
int[] dizi = new int[10];
for (int i = 0; i < dizi.Length; i++)
{
    dizi[i] = i * i; // dizi elemanları 0, 1, 4, 9, 16... şeklinde değerler alacaktır.
}
int[] dizi2 = dizi; // dizi2' ye dizi atanır
dizi[5] = 0; // dizi' nin 5 indisli elemanı 0' a eşitlenir
// mantıken dizi[5] değeri 0 olur, ancak dizi2[5] değeri de 0 olmalı mıdır?
// dizileri ekrana yazdırır görülebilir
for (int i = 0; i < dizi2.Length; i++)
{
    Console.Write($"{dizi2[i]}\t"); // dizi2 elemanları ekrana yazılır
}
Console.WriteLine(); // yeni satıra geçilir
for (int i = 0; i < dizi2.Length; i++)
{
    Console.Write($"{dizi[i]}\t"); // dizi elemanları ekrana yazılır
}
    

Referans tür veriler birbirlerine eşitlendiğinde bellek üzerindeki adresleri birbirine eşitlenmiş olur. Eşitleme işleminden sonra birinin değeri değiştirilirse diğeri de değişecektir. Diziler de referans türü değişkenler olduğu için birinin 5. indisi değişince diğerinde de aynı değişiklik gözlemlenir.

Dizi Elemanlarına İlk Değer Verme

Aşağıdaki kod satırında dizinin elemanlarının ilk değerleri belirlenmiştir.

    
int[] rakamlar = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// ilk değerleri bu şekilde yazacaksanız uzunluk belirtmeyebilirsiniz
int[] rakamlar = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    

Array Sınıfı

Array sınıfına ait metotları kullanarak diziler üzerinde çeşitli işlemler gerçekleştirilebilir. Array.Copy metodunun kullanım şekli aşağıdaki gibidir.

    
int[] dizi1 = new int[] { 1, 3, 4, 5 };
int[] dizi2 = new int[] { 2, 6, 10, 12 };
Array.Copy(dizi1, dizi2, 4); // dizi1' den dizi2' ye 4 eleman kopyalanır
for (int i = 0; i < dizi2.Length; i++)
{
    Console.Write($"{dizi2[i]}\t");
}
Console.ReadKey();
    

Dizi Boyutunun Değere Göre Belirlenmesi

Ekrandan alınan bir sayıya göre dizi boyutunu belirleyebilirsiniz. Aşağıdaki kodda ekrandan okunan sayı değeri büyüklüğü bir dizi oluşturuluyor. Bu büyüklük kadar döngü adımı ile her bir elemana değer veriliyor. Ardından Sum metodu ile toplam değer hesaplanıyor.

    
Console.Write("Dizi kaç elemanlı olacak?: ");
int adet = Convert.ToInt32(Console.ReadLine());
int[] dizi = new int[adet];
for (int i = 0; i < adet; i++)
{
    Console.Write("{0}. değeri girin: ", i + 1);
    dizi[i] = Convert.ToInt32(Console.ReadLine());
}
int toplam = dizi.Sum();
// Sum metodu dizi elemanlarının toplamını veren bir metottur
Console.WriteLine("Toplam: {0}", toplam);
Console.WriteLine("Ortalama: {0}", (double)toplam / adet);
Console.ReadKey();
    

Çok Boyutlu Diziler

Bir dizinin indisine birden fazla sayı belirterek diziyi çok boyutlu hale getirebilirsiniz.

    
string[,] markalar = new string[3, 5];
markalar[0, 0] = "MSI";
markalar[0, 1] = "ASUS";
markalar[0, 2] = "Casper";
markalar[0, 3] = "HP";
markalar[0, 4] = "Lenovo";

markalar[1, 0] = "Blizzard";
markalar[1, 1] = "Ubisoft";
markalar[1, 2] = "Bethesda";
markalar[1, 3] = "Rockstar";
markalar[1, 4] = "EA";

markalar[2, 0] = "Microsoft";
markalar[2, 1] = "Apple";
markalar[2, 2] = "Google";
markalar[2, 3] = "Yahoo";
markalar[2, 4] = "Facebook";

Console.WriteLine($"Uzunluk: {markalar.Length}"); 
// Dizi uzunluğu 15 olacaktır
Console.ReadKey();
    

Diziyi üç, dört veya daha fazla boyutlu tanımlamak için aşağıdaki örnekleri uygulamanız yeterlidir.

    
double[,,] uc_boyutlu = new double[5, 3, 9];
float[,,,] dort_boyutlu = new float[7, 4, 6, 8];
    

Pürüzlü (Jagged) Diziler

Çok boyutlu dizilerde her boyutun aynı sayıda elemanı olur. Örneğin bir dizi [4, 6] olarak tanımlandıysa şema aşağıdaki gibi olur.


[0, 0] [0, 1] [0, 2] [0, 3] [0, 4] [0, 5]
[1, 0] [1, 1] [1, 2] [1, 3] [1, 4] [1, 5]
[2, 0] [2, 1] [2, 2] [2, 3] [2, 4] [2, 5]
[3, 0] [3, 1] [3, 2] [3, 3] [3, 4] [3, 5]

Ancak jagged (düzensiz) dizilerde her boyutun elemanında farklı sayıda eleman olabilir. Esasında mantık olarak pürüzlü diziler, dizilerden oluşan dizilerdir denebilir. Yani her elemanı ayrı birer dizidir. Çok boyutlu dizilerden farklı olarak aşağıdaki gibi tanımlanır.

    
string[][] jagged = new string[6][];
// 6 elemanlı string dizilerinden oluşan dizi
jagged[0] = new string[4];
// örneğin ilk eleman 4 adet alt eleman içersin
jagged[1] = new string[7];
// sonraki eleman 7 adet alt eleman içersin
jagged[2] = new string[1];
// 2 indisli eleman sadece 1 eleman içersin
jagged[3] = new string[5];
jagged[4] = new string[4];
jagged[5] = new string[3];
    

Bu şekilde tanımlanan bir dizinin şeması aşağıdaki gibi olacaktır.


jagged[0][0] jagged[0][1] jagged[0][2] jagged[0][3]
jagged[1][0] jagged[1][1] jagged[1][2] jagged[1][3] jagged[1][4] jagged[1][5] jagged[1][6]
jagged[2][0]
jagged[3][0] jagged[3][1] jagged[3][2] jagged[3][3] jagged[3][4]
jagged[4][0] jagged[4][1] jagged[4][2] jagged[4][3]
jagged[5][0] jagged[5][1] jagged[5][2]

Bu tarz dizilerde Length özelliği tüm alt elemanların sayısını vermez. Dizinin altında kaç adet dizi olduğunu verir.

    
string[][] jagged = new string[4][];
for (int i = 0; i < jagged.Length; i++)
    jagged[i] = new string[i + 1];
// her bir eleman i + 1 büyüklüğünde dizi olarak tanımlanır
for (int i = 0; i < jagged.Length; i++)
{
    for (int j = 0; j < jagged[i].Length; j++)
    {
        jagged[i][j] = $"{i} - {j}";
    }
}
Console.WriteLine($"Büyüklük: {jagged.Length}");
Console.WriteLine($"[0] indis büyüklüğü: {jagged[0].Length}");
Console.WriteLine($"[1] indis büyüklüğü: {jagged[1].Length}");
Console.WriteLine($"[2] indis büyüklüğü: {jagged[2].Length}");
Console.WriteLine($"[3] indis büyüklüğü: {jagged[3].Length}");
Console.WriteLine($"Toplam büyüklük: {jagged.Sum(arr => arr.Length)}");
Console.ReadKey();
    

jagged isimli dizinin Length değeri yani uzunluğu 4' tür. Pürüzlü bir dizi while, for ve switch işlemlerinin uygulandığı, fatura kayıtlarının tutulduğu örnek uygulamayı incelemek için buraya tıklayabilirsiniz.

Listeler

Dizilerden farklı olarak listelerin boyutları değiştirilebilmektedir. Ekleme, silme gibi metotlar barındıran bu referans değişken türü son derece esnek ve sık kullanılan bir yapıya sahiptir.

    
List<string> metinler = new List<string>();
List<string> sehirListesi = new List<string>() 
    { "İstanbul", "Ankara", "İzmir", "Antalya", "Diyarbakır", "Trabzon", "Hatay" };
List<int> sayilar = new List<string>();
List<int> plakaListesi = new List<string>()
    { 34, 6, 35, 7, 21, 61, 31 };
    

Aşağıdaki kodda List türüne ait çeşitli metotları görebilir ve uygulayabilirsiniz.


List<string> liste = new List<string>() { "Elma", "Çilek" };
// liste tanımlanırken ilk iki elemanla beraber tanımlanır
liste.Add("Portakal");
// Portakal metni eleman olarak eklenir
liste.Add("Armut");
// Armut metni eleman olarak eklenir
liste.AddRange(new string[]{ "Kavun", "Karpuz" });
// Tek seferde birden çok elemanı dizi olarak ekleyebilirsiniz.
foreach (var eleman in liste)
    Console.Write(eleman + "  ");
Console.WriteLine();
// liste foreach ile ekrana yazdırılır
// Elma  Çilek  Portakal  Armut  Kavun  Karpuz
liste.Remove("Armut"); // Armut metni silinir
foreach (var eleman in liste)
    Console.Write(eleman + "  ");
Console.WriteLine();
// liste tekrar yazdırılır
// Elma  Çilek  Portakal  Kavun  Karpuz
liste.RemoveAt(1); // 1 indisli eleman silinir
foreach (var eleman in liste)
    Console.Write(eleman + "  ");
Console.WriteLine();
// liste tekrar yazdırılır
// Elma  Portakal  Kavun  Karpuz
liste.Reverse(); // liste ters çevrilir
foreach (var eleman in liste)
    Console.Write(eleman + "  ");
Console.WriteLine();
// liste tekrar yazdırılır
// Karpuz  Kavun  Portakal  Elma
liste.Clear(); // listedeki tüm elemanlar silinip liste temizlenir
Console.ReadKey();

Boş bir liste ile null değere eşit olan liste arasındaki fark önemlidir. null, referans türü bir değişkene herhangi bir atama yapılmadığını gösterir. Dizi ve listeler referans türü değişkenlerdir. Ancak listenin boş olması herhangi bir atama yapıldığını ancak eleman eklenmediğini gösterir.

null değerli bir listeye Add metodu ile ekleme yapılmaya çalışılırsa NullReferenceException hatası döner. Null kavramını daha iyi anlamak için buraya tıklayın.

İlişkili İçerikler

Koleksiyonlar ile karmaşık verileri belli anahtar değerlere karşılık gelecek biçimde tutmak mümkündür.

Paylaşın
Etiket Bulutu