
Önceki anlatımda dizilerden bahsetmiştik, diziler ve koleksiyonlar birbirine benzer yapılardır. Dizi belirtirken dizinin tipini ve içerisinde kaç eleman barındıracaksa programın yani dizi tanımlama aşamasında dizinin kapasitesi de belirtebiliyorduk. Tabi ilerleyen zamanlarda bunu değiştiremeyebiliyoruz (jagger diziler hariç) .
Bazı programlarda belirttiğimiz eleman sayısını ve büyüklüğünü değiştirmek isteyebiliriz. Bu durumda biz dizi yerine koleksiyonları kullanabiliriz. Diziler için fazla bir metot bulunmayabiliyor. Yani string işlemlerini çok işlek bir biçimde dizilerde kullanamayabilirsiniz. Bu durumda koleksiyonlara başvurmanız işlemlerinizi daha da hızlandıracaktır.
Tabi dizi ve koleksiyonlarda ortak olan özellikleri de mevcuttur.
İki yöntemde de başta belirtirken ne tür değişkenler barındırdığını belli etmek zorundasınız. Tabi belirlenen tip daha sonrasında değiştirmeniz mümkün değildir.
1 2 3 |
// Tip Belirleme List<string> sehirler = new List<string> { "elazığ", "istanbul", "ordu"}; string[] sehirler1 = new string[3] { "Kocaeli", "Bursa", "Palu :)" }; |
Dizi ve koleksiyonlarda her ikisinde de indisle bir biçimde değer atayabiliyoruz.
1 2 3 |
// İndisleme - İndexleme sehirler[0] = "Erzurum"; sehirler1[2] = "Erzincan"; |
Dizilerde ve koleksiyonlarda eleman sayısını bulak istediğimizde normal dizide “ornekdizi.Length” diye bulunurdu aynı şekilde koleksiyonlarda da “ornekkoleks.Count” diye bulunabilir yani aşağıdaki gibi bulunabilir .
1 2 3 4 5 6 7 8 9 10 11 |
// Dizi ve Koleksiyonlar List<string> sehirler = new List<string> { "Amsterdam", "Roma", "Paris"}; string[] sehirler1 = new string[3] { "Kocaeli", "Bursa", "Palu :)" }; sehirler[0] = "Erzurum"; sehirler1[2] = "Erzincan"; int yurtdisi_il_sayi = sehirler.Count; int yurtici_il_sayi = sehirler1.Length; Console.ReadLine(); |
C# ta koleksiyonları kişilerin kullanımına göre şekillenmiştir. Aşağıdaki şekli inceleyecek olursanız.
Kullanmakta olduğumuz 5 tip koleksiyonumuz mevcuttur. Bu beş yapının içerisinde genel itibariyle List ve Dictionary yapılarını kullanırız. Tabi ihtiyaç dâhilinde bu genellemeyi değiştirebilirsiniz.
Koleksiyon Tipleri
Belirtiğimiz koleksiyonlar üzerinden bir kaç tanımlama ve örnekle açıklarsak işin kolaylığı belirginleşmiş olacaktır.
List Koleksiyonu
Bu koleksiyon tipinde listeler oluşturabilirsiniz, hatta klaslar yardımıyla da oluşturacağınız listeyi şekillendirebilir ve detaylandırabilirsiniz. İlk önce basit bir liste oluşturma ile başlayalım.
1 2 3 4 5 6 7 |
// Koleksiyon Tanımlama List<string> listem = new List<string> { "kalem", "Kitap", "Defter", "Silgi" }; // Bu şekilde oluşturabilirim. List<string> faturalar = null; // bu şekilde de oluşturabilirim . faturalar.Add("Elektrik"); // Eklemek istediğimde bu şekilde ekleme yapabiliyorum listem.Add("Boya"); |
Bu şekilde basit liste oluşturulabilir. Başka bir örneği biraz daha detaylı yapacak olursak aşağıdaki gibi olacaktır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// Detaylı Klas Örneği class kişi // burada listemizi barındıracağımız klas oluşturuyoruz { public string ad { get; set; } // İsim public string soyad { get; set; } // Soyisim public string adres { get; set; } // Adres public int borç { get; set; } // Borcu } static void Main(string[] args) { Console.WriteLine("Kişi Listesi"); List<string> isimler = new List<string>(); List<kişi> müşeriler = new List<kişi>(); müşeriler.Add(new kişi() { ad = "Ahmet", soyad = "turan", adres = "İzmir", borç = 1000 }); // Ekleme yapabilirim . müşeriler.Add(new kişi() { ad = "Metin", soyad = "Tok", adres = "Foça", borç = 2000 }); müşeriler.Add(new kişi() { ad = "Necdet", soyad = "sadeık", adres = "Trabzon", borç = 4000 }); müşeriler.Add(new kişi() { ad = "Ahmet", soyad = "yerebakanyürekşeyyapan", adres = "Antep", borç = 0000 }); müşeriler.RemoveAt(0); // Buradan istediğim müşteriyi silebilirim . foreach (var item in müşeriler) //Burada Müsteri değerlerimi yazdırıyorum { Console.WriteLine("isim: "+item.ad+ "\n soyisim: " + item.soyad+ " adres: " + item.adres+ " borç: " + item.borç+" TL"); } |
Yaptığımız örnek tam olarak ne yapabilir diye soracak olursanız. Burada kişiye ait aldığımız bilgileri bir liste halinde kayıt edebiliriz, değere göre sıralamasını yapabilir. İstendiği takdirde değerler dışarıdan da istenebilir ve böylelikle listemizi interaktif güncelleyebilirsiniz. Tabi bununla beraber yapabileceğimiz daha fazla işlemi uygulayabilirsiniz. Yani bir müşteriyi silebilirim ya da ekleyebilirim bununla beraber istediğim işlemleri uygulayabilirim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// Yapılabilen İşlemler class kişi // burada listemizi barındıracağımız klas oluşturuyoruz { public string ad { get; set; } // İsim public string soyad { get; set; } // Soyisim public string adres { get; set; } // Adres public int borç { get; set; } // Borcu } static void Main(string[] args) { Console.WriteLine(" Kişi Listesi"); List<string> isimler = new List<string>() { "Ahmet", "Metin", "Necdet", "Ahmet" }; List<kişi> müşeriler = new List<kişi>(); müşeriler.Add(new kişi() { ad = "Ahmet", soyad = "turan", adres = "İzmir", borç = 1000 }); // Ekleme yapabilirim . müşeriler.Add(new kişi() { ad = "Metin", soyad = "Tok", adres = "Foça", borç = 2000 }); müşeriler.Add(new kişi() { ad = "Necdet", soyad = "sadeık", adres = "Trabzon", borç = 4000 }); müşeriler.Add(new kişi() { ad = "Ahmet", soyad = "yerebakanyürekşeyyapan", adres = "Antep", borç = 0000 }); foreach (var item in müşeriler) //Burada Müsteri değerlerimi yazdırıyorum { Console.WriteLine("isim: "+item.ad+ "\n soyisim: " + item.soyad+ " adres: " + item.adres+ " borç: " + item.borç+" TL"); } müşeriler.RemoveAt(0); // Buradan istediğim müşteriyi silebilirim . isimler.Sort(); // Kısaltma Uygulayabilirim müşeriler.Insert(0, new kişi() { ad = "Emre", soyad = "uslu", adres = "Sivas", borç = 50000 }); // Herhangi bir yere ekleme yapaabilirim string bul = isimler.Find(a => a.StartsWith("A")); // bu şekilde ilk harfi ile arama yapabilirim. string bul2 = isimler.Find(a => a.Length>10); // Harf sayısı 10 dan yüksek olanları arayıp bul2 değerine atayabiliim |
Kısaca anlatmak gerekirse ilk önce müşterimi tanımlayacak bir class yarattım. Tipleri de ad, soyadı ve adres için string, borç değeri için de int değeri ile tanımladım.
Daha sonrasında list.Add parametreleri ile gerekli kayıtları yapıp ekrana bir foreach yardımıyla yazdım . Siz de yapabilirsiniz.
Dictionary Koleksiyonu
Dictionary koleksiyonu diğerlerinden farklı olarak bir anahtarı bulunmaktadır. Yani aynı indexte iki farklı değişken tutar. Birine “key” diğerine de “value” yani Türkçesi “anahtar” ve “Değer” anlamına gelmektedir. Böylelikle birbiri ile ilişkili yapıları kullanırken daha kolay bir şekilde yapabilirsiniz.
Bir Dictionary koleksiyonu oluştururken key ve value değerlerini girmelisiniz. Aşağıda gördüğünüz gibi siz de deneyerek bunu uygulayabilirsiniz.
1 2 3 4 5 6 7 |
Dictionary<int, string> iller_plakalar = new Dictionary<int,string>();// Dictionary koleksiyon bu şekilde oluşturulur. iller_plakalar.Add(01, "Adana"); // eleman eklerken de bu şekilde ekleme yapılır . iller_plakalar.Add(02, "Adıyaman"); iller_plakalar.Add(41, "Kocaeli"); iller_plakalar.Add(56, "Siirt"); iller_plakalar.Add(21, "Diyarbakır"); iller_plakalar.Remove(41); // böyle de o bu key sırasında bulunan değerlerin silinmesi mümkün . |
Bu uygulama biçimi bizim diğer değerlerin birbiri ile ilişkilerini sağlamaktadır.
Daha da pratiklik açısında kısa bir uygulama gerçekleştirebilişiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
// Plaka uygulaması Dictionary<int, string> iller_plakalar = new Dictionary<int,string>(); iller_plakalar.Add(01, "Adana"); iller_plakalar.Add(02, "Adıyaman"); iller_plakalar.Add(41, "Kocaeli"); iller_plakalar.Add(56, "Siirt"); iller_plakalar.Add(21, "Diyarbakır"); iller_plakalar.Remove(41); int plk1; while (true) { Console.WriteLine("Plakayı Giriniz: "); string plk = Console.ReadLine(); if (!int.TryParse(plk, out plk1)) { Console.WriteLine("Lütfen bir Sayı giriniz"); } else { break; } } foreach (var item in iller_plakalar) { if (item.Key==plk1) { Console.WriteLine(item.Value); } } if (!iller_plakalar.ContainsKey(plk1)) { Console.WriteLine("Böyle bir şehir yok "); } |
Queue ve Stack Koleksiyonları
Queue kelime anlamından da anlaşılacağı gibi bir sıralama koleksiyonudur. Örneğin bir kesiyer düşünün ilk sırada olan ilk ayrılan olarak bilinir.
Stack koleksiyonu ise Queue koleksiyonu ile ters anlamdadır. İlk sırada olan en son işleme girer. Bu bir nevi çöpü sıkıştırmaya benzer. En son eklediğiniz çöp en üsttedir ve çöp dökerken ilk çöp atılır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// Stack ve Queue Koleksiyonu Console.WriteLine("Düz Sıralama\n"); Queue sıram = new Queue(); for (int i = 1; i < 10; i++) { sıram.Enqueue(i); // Sıraya alma (Ekleme) } sıram.Dequeue(); // Sıradakini çıkarma muhtemelen ilk eklenen elemeanı alacak foreach (var item in sıram) { Console.Write(item+" "); } Console.WriteLine("\n" + "Sıradaki \n" + sıram.Peek() + "\n"); // sıra.Peek() ile sıradaki elemanı görebilirsiniz. Console.WriteLine(""); Console.WriteLine("\nTers sıralama\n "); Stack ters_sıram = new Stack(); for (int i = 1; i < 10; i++) { ters_sıram.Push(i); // Bununla ters sıraya elaman aldım . } ters_sıram.Pop(); // Sıradakini gönderdim foreach (var item in ters_sıram) { Console.Write(item+" "); } Console.WriteLine("\n"+"Sıradaki \n"+ters_sıram.Peek()); Console.Read(); |
Bir işlemi yapmak için belli bir miktarda bir sıra oluşturacaksanız bu tam da sizin uygulamalarınızı şekillendirecek biçimde oluşturulmuş bir koleksiyondur. Çünkü burada istediğini belirli sayıda veri işleyebilir geri kalan kısmını sonradan kullanabilirsiniz.
HashSet Koleksiyonu
HashSet koleksiyonu List koleksiyonu ile aynı yapıdadır. Fakat burada bir fark olarak aynı değeri eklediğiniz vakit program onun klonunu listeye eklemede bulunmaz. List koleksiyonunda kullandığınız hemene hemen tüm fonksiyonları bu kullanabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// HashSet Koleksiyonu HashSet<String> listem = new HashSet<string>(); // Koleksiyon tek List'e benzer yapıdadır listem.Add("Batman"); // Böyle ekleme yapılır . Bu ekleme aynı zamanda bir boolean cinsinden yanıt verir listem.Add("Adama"); listem.Add("İstanbul"); listem.Add("Kayseri"); listem.Add("Adama"); // Aynı olduğu için bunu eklemeyecek .Yani false yanıt verecektir. Console.Write("Lütfen bir Şehir giriniz: "); string a = Console.ReadLine(); if (listem.Add(a)==false) { Console.WriteLine("Aynı şehir girmeye çalışıyorsunuz Lütfen Farklı Giriniz "); } |
Kısacası HashSet yapısı diğer koleksiyonlarda olduğu gibi görevleri gören ve bu görevleri aynı zamanda denetleyen bir yapı olduğunu söz etmek mümkün. Çünkü bir içeriğinin aynı zamanda eklenip eklenmeyeceğine de karar veren verir. Bu sebeple eklemek istediğimiz içerik eklendi mi? Sorusunu sorarken boolean tipte bize cevap verir.
Yukarıdaki örneği daha da inceleyecek ve geliştirecek olursak.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// Hashset Örnek HashSet<String> listem = new HashSet<string>(); listem.Add("Batman"); // Böyle ekleme yapılır . Bu ekleme aynı zamanda bir boolean cinsinden yanıt verir listem.Add("Adama"); listem.Add("İstanbul"); listem.Add("Kayseri"); listem.Add("Adama"); // Aynı olduğu için bunu eklemeyecek .Yani false yanıt verecektir. string[] şehrler = { "Hakkari", "İzmir", "İstanbul" }; listem.UnionWith(şehrler); // Dizi ile Koleksiyonu birleştirir . Console.Write("Lütfen bir Şehir giriniz: "); string a = Console.ReadLine(); if (listem.Add(a)==false) { Console.WriteLine("Aynı şehir girmeye çalışıyorsunuz Lütfen Farklı Giriniz "); } foreach (var item in listem) { Console.WriteLine(item); } listem.IntersectWith(şehrler); // Dizi ile koleksiyon elemanlarının kesişim kumesini gösterir . foreach (var item in listem) { Console.WriteLine("\n" + item); } Console.Read(); |
Evet, böylelikle temel console uygulamalarımızın sonuna da gelmiş bulunduk. Thebookofbilge’de öğrenme denemeleri dememedeki asıl amacım insanların hevesini kırmamak onları buraya çekmek oldu, eğitim şekillendirir insanı hayalinin gücünü görmeyi öğretir. Özellikle de sevmeyi öğretir. Farkında değilsiniz ama arka planda ben de öğreniyorum bazı şeyleri anlatırken ve zamanımın en kıymetli anlarının olduğunun biliyorum. Bizi yeşertecek umutlarınız varsa ardından koşun….
Form anlatımlarında görüşmek üzere, iyi kalın.