Akis Forum

Welcome to AkisForum.com! Register your free account today and become a member! Once signed in, you'll be able to dive into learning to code, discovering new tools, and keeping up with the latest trends. AkisForum is where benefit, knowledge, and sharing come together. Join us to add your own topics and posts, and connect with other members through your private inbox!

C# ile Diziler ve Koleksiyonlar: Verileri Düzenli Saklama Sanatı[

  • Konuyu Başlatan Konuyu Başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi

Admin

Herşeyi Burada Bulabilirsin
Yönetici
Administrator
Akisor
C# ile Diziler ve Koleksiyonlar: Verileri Düzenli Saklama Sanatı

Merhaba değerli C# meraklıları,

Bugün, programlamanın en temel ve en kritik konularından biri olan diziler (Arrays) ve koleksiyonlar (Collections) hakkında konuşacağız. Yazdığımız programlarda çoğu zaman tekil değişkenler yerine, birbiriyle ilişkili birden fazla veriyi saklama ihtiyacı duyarız. İşte bu noktada diziler ve koleksiyonlar devreye giriyor. Bu yapılar, verileri düzenli bir şekilde depolamamızı, erişmemizi ve işlememizi sağlar.

Hazırsanız, verilerimizi nasıl daha düzenli hale getireceğimizi öğrenelim!

-- -- --​

Diziler (Arrays): Sabit Boyutlu Veri Depolama

Diziler, aynı tipteki birden fazla veriyi art arda bellekte saklamamızı sağlayan sabit boyutlu yapılardır. Bir dizi tanımladığınızda, bellekte ne kadar yer kaplayacağı en baştan belirlenir ve sonradan bu boyutu değiştiremezsiniz.

Dizi Tanımlama ve Kullanım:

C#:
// Boş bir integer dizisi tanımlama (5 elemanlı)
int[] sayilar = new int[5]; // Tüm elemanlar varsayılan olarak 0 olur

// Elemanları başlangıçta atayarak dizi tanımlama
string[] meyveler = { "Elma", "Armut", "Muz", "Çilek" };

// Elemanlara erişim (indeksler 0'dan başlar!)
Console.WriteLine($"İlk meyve: {meyveler[0]}"); // Çıktı: Elma
Console.WriteLine($"Son meyve: {meyveler[3]}"); // Çıktı: Çilek

// Bir elemanı değiştirme
meyveler[1] = "Nar";
Console.WriteLine($"Değişen meyve: {meyveler[1]}"); // Çıktı: Nar

// Dizinin uzunluğunu bulma
int meyveSayisi = meyveler.Length; // meyveSayisi = 4
Console.WriteLine($"Meyve sayısı: {meyveSayisi}");

// Döngü ile dizi elemanlarına erişim
Console.WriteLine("Tüm meyveler:");
for (int i = 0; i < meyveler.Length; i++)
{
    Console.WriteLine($"- {meyveler[i]}");
}

Çok Boyutlu Diziler:

Diziler tek boyutlu olabileceği gibi, matrisler gibi çok boyutlu da olabilir.

C#:
// 2x3'lük bir matris (satır, sütun)
int[,] matris = new int[2, 3];

// Değer atama
matris[0, 0] = 1;
matris[0, 1] = 2;
matris[0, 2] = 3;
matris[1, 0] = 4;
matris[1, 1] = 5;
matris[1, 2] = 6;

// Değer okuma
Console.WriteLine($"Matristeki (0,1) elemanı: {matris[0, 1]}"); // Çıktı: 2

// İç içe döngülerle matrisi yazdırma
Console.WriteLine("Matris:");
for (int i = 0; i < matris.GetLength(0); i++) // 0. boyut (satırlar)
{
    for (int j = 0; j < matris.GetLength(1); j++) // 1. boyut (sütunlar)
    {
        Console.Write($"{matris[i, j]} ");
    }
    Console.WriteLine(); // Bir satır bitince alt satıra geç
}

-- -- --​

Koleksiyonlar (Collections): Dinamik ve Esnek Veri Yapıları

Dizilerin sabit boyutlu olması bazen dezavantaj olabilir. Program çalışırken eleman eklemek veya çıkarmak istediğimizde diziler bu konuda esnek değildir. İşte bu noktada koleksiyonlar imdadımıza yetişir! Koleksiyonlar, System.Collections ve System.Collections.Generic namespace'leri altında bulunan, daha esnek ve dinamik veri yapılarıdır.

1. List<T> (Generic List)

En sık kullanılan koleksiyonlardan biridir. Dinamik boyutlu bir dizidir, yani istediğiniz zaman eleman ekleyip çıkarabilirsiniz.
Kod:
<T>
buradaki generic tip göstergesidir, yani listenin hangi tipte veri tutacağını belirtirsiniz (örneğin
Kod:
List<int>
,
Kod:
List<string>
).

C#:
// Integer tipinde bir liste oluşturma
List<int> notlar = new List<int>();

// Eleman ekleme
notlar.Add(85);
notlar.Add(92);
notlar.Add(78);
notlar.Add(65);

// Elemanlara erişim (diziler gibi indeksle)
Console.WriteLine($"İlk not: {notlar[0]}"); // Çıktı: 85

// Eleman çıkarma
notlar.Remove(78); // Değeri 78 olan elemanı çıkarır
// veya notlar.RemoveAt(0); // 0. indeksteki elemanı çıkarır

// Listenin eleman sayısını bulma
Console.WriteLine($"Not sayısı: {notlar.Count}"); // Dizideki Length yerine Count kullanılır

// Tüm elemanları yazdırma (foreach döngüsü idealdir)
Console.WriteLine("Tüm Notlar:");
foreach (int not in notlar)
{
    Console.WriteLine($"- {not}");
}

// Belirli bir değerin listede olup olmadığını kontrol etme
bool varMi = notlar.Contains(92); // varMi = true
Console.WriteLine($"92 notu listede var mı? {varMi}");

2. Dictionary<TKey, TValue> (Generic Dictionary)

Anahtar-değer (Key-Value) çiftleri şeklinde veri saklayan bir koleksiyondur. Her anahtar benzersiz olmalıdır. Bir anahtara karşılık gelen değeri hızlıca bulmak istediğimizde çok işe yarar.

C#:
// Öğrenci numarası (int) ve öğrenci adı (string) tutan bir sözlük
Dictionary<int, string> ogrenciler = new Dictionary<int, string>();

// Eleman ekleme
ogrenciler.Add(101, "Ayşe Yılmaz");
ogrenciler.Add(102, "Berk Demir");
ogrenciler.Add(103, "Ceren Kaya");

// Elemanlara anahtar ile erişim
Console.WriteLine($"102 numaralı öğrenci: {ogrenciler[102]}"); // Çıktı: Berk Demir

// Eleman değiştirme
ogrenciler[103] = "Ceren Yılmaz";
Console.WriteLine($"103 numaralı öğrenci (güncel): {ogrenciler[103]}"); // Çıktı: Ceren Yılmaz

// Bir anahtarın olup olmadığını kontrol etme
if (ogrenciler.ContainsKey(101))
{
    Console.WriteLine("101 numaralı öğrenci bulundu.");
}

// Bir değeri döngü ile gezme
Console.WriteLine("Tüm öğrenciler:");
foreach (var ogrenci in ogrenciler) // DictionaryEntry veya KeyValuePair<TKey, TValue>
{
    Console.WriteLine($"Numara: {ogrenci.Key}, Ad: {ogrenci.Value}");
}

// Sadece anahtarları veya sadece değerleri gezme
Console.WriteLine("Sadece öğrenci adları:");
foreach (string ad in ogrenciler.Values)
{
    Console.WriteLine(ad);
}

3. Queue<T> (Generic Queue)

"İlk giren ilk çıkar" (First-In, First-Out - FIFO) prensibiyle çalışan bir koleksiyondur. Kuyruk mantığıyla çalışır.

C#:
Queue<string> isSirasi = new Queue<string>();

isSirasi.Enqueue("Görev A"); // Kuyruğa eleman ekle
isSirasi.Enqueue("Görev B");
isSirasi.Enqueue("Görev C");

Console.WriteLine($"Kuyruktaki ilk eleman: {isSirasi.Peek()}"); // Kuyruğun başındaki elemanı gösterir (çıkartmaz)

string ilkGorev = isSirasi.Dequeue(); // Kuyruktan ilk elemanı çıkarır ve döndürür
Console.WriteLine($"Çıkarılan görev: {ilkGorev}"); // Çıktı: Görev A

Console.WriteLine($"Kuyrukta kalan eleman sayısı: {isSirasi.Count}");

4. Stack<T> (Generic Stack)

"Son giren ilk çıkar" (Last-In, First-Out - LIFO) prensibiyle çalışan bir koleksiyondur. Yığın mantığıyla çalışır.

C#:
Stack<string> geriAlIslemleri = new Stack<string>();

geriAlIslemleri.Push("Yazma"); // Yığına eleman ekle
geriAlIslemleri.Push("Silme");
geriAlIslemleri.Push("Biçimlendirme");

Console.WriteLine($"Yığının en üstündeki işlem: {geriAlIslemleri.Peek()}"); // En üstteki elemanı gösterir

string sonIslem = geriAlIslemleri.Pop(); // Yığından en üstteki elemanı çıkarır ve döndürür
Console.WriteLine($"Geri alınan işlem: {sonIslem}"); // Çıktı: Biçimlendirme

Console.WriteLine($"Yığında kalan işlem sayısı: {geriAlIslemleri.Count}");

-- -- --​

Ne Zaman Hangisini Kullanmalı?

  • Diziler: Boyutun sabit olduğu ve performansa ihtiyacınız olduğu durumlarda (örneğin, bir grafik uygulamasında piksel verileri gibi).
  • List<T>: Boyutun dinamik olduğu, sık sık eleman ekleyip çıkaracağınız ve elemanlara indeksle erişmeniz gereken durumlarda (en sık kullanılan koleksiyon!).
  • Dictionary<TKey, TValue>: Anahtar-değer ilişkisiyle verilere hızlıca erişmeniz gereken durumlarda (örneğin, ID'ye göre kullanıcı bilgisi çekme).
  • Queue<T>: İşlemlerin veya öğelerin belirli bir sıraya göre (FIFO) işlenmesi gereken durumlarda (örneğin, mesaj kuyrukları, görev sırası).
  • Stack<T>: Geri alma işlemleri, fonksiyon çağrıları gibi LIFO mantığıyla çalışan durumlarda (örneğin, tarayıcı geçmişi).

---

Diziler ve koleksiyonlar, C# programlamanın temel yapı taşlarındandır. Bu veri yapılarını anlamak ve doğru yerde doğru olanı kullanmak, daha düzenli, daha etkili ve daha performanslı kod yazmanızı sağlar. Bol bol pratik yaparak bu yapıları iyice kavramanızı öneririm.

Bu konu hakkında eklemek istediğiniz veya sormak istediğiniz başka bir şey var mı?

İyi kodlamalar!
 
Geri
Üst