ArrayList ve struct örneği

Bu makalede ArrayList sınıfı ve struct yapısını uygulamada nasıl kullanırız basit bir örnek ile anlatayım.

Struct yapısnı bir çok kaynaktan okuyup aklınızda bir şeyler canlanmıştır. Burada bende tekrar etmek istemiyorum. Ama birşeyler söylemeden de geçmek istemiyorum. Struct şöyle de düşünebilirsiniz; listview e kayıt edeceğimiz bir liste şeklinde kayıt kümemiz olsun. Bu veriyi listview kontrolünü kullanmadan, liste şeklinde ram üzerinde tutabilir , gerektiği zamanda sabit bir yere toplu bir şekilde kayıt edebilirsiniz. Struct’ı böyle düşünebilirsiniz.

Arraylist ise klasik dizilere nazaran daha esnek bir yapıya sahiptir. Arraylist sayesinde sabit sınır tanımlamadan istediğiniz kadar kullanabilirsiniz.

Struct yanında arralist i, baklavanın yanında dondurma gibi düşünebilirsiniz. İkisini kullanarak satırlarca yazdığınız kodlar yerine birkaç satırda işinizi görebilirsiniz. Fazla uzatmadan örnek uygulamamıza geçmek istiyorum. Öncelikle resimdeki gibi form ekranı düzenleyerek başlayabiliriz. Burada yapılan iş kişilerin ad, soyad, memleket gibi bilgilerini tutmakta.

Bu bilgileri liste şeklin de tutabilmek için struct yapısını tanımlayalım.

[cc lang=”c#”] struct kisiler
{
public string ad, soyad, memleket;
public override string ToString()
{
return ad + soyad + memleket;
}
} [/cc]

Ardından arraylist ile oluşturduğumuz yapı şeklinde listeye ekleyelim.

[cc lang=”c#”]

//using System.Collections; eklemeyi unutmayın

ArrayList kayitlar = new ArrayList();
private void btnekle_Click(object sender, EventArgs e)
{
kisiler kisi;
kisi.ad = txtad.Text;
kisi.soyad = txtsoyad.Text;
kisi.memleket = txtmemleket.Text;

kayitlar.Add(kisi);
} [/cc]

Böylelikle istediğiniz kadar veri ekleyip tutabilirsiniz. Tutuğunuz bu verileri listview kontrolünde göstermek için listele ismini verdiğim buton olayına alttaki kodları yazıyoruz.

[cc lang=”c#”] private void btnlistele_Click(object sender, EventArgs e)
{
foreach (kisiler item in kayitlar)
{
ListViewItem lv = new ListViewItem();
lv.Text = item.ad.ToString();
lv.SubItems.Add(item.soyad.ToString());
lv.SubItems.Add(item.memleket.ToString());
listView1.Items.Add(lv);
}

} [/cc]

En büyük sayıyı bulma

Başlık size biraz programlama dünyasına göre klişe bir örnek gelmiş olabilir. Genelde bu şekilde internet de aratma yaptığınızda gelen sonuçlar konsol ekranında girilen 3 sayıdan büyüğünü bulma gibi örnekler karşımıza çıkmıştır. Tabi arada farklı olanları saymazsak.

Böyle basit makaleyi nereden yazdım derseniz anlatayım; veri kayıt etmek için xml e ihtiyaç duydum.(bu aralar xml ile yatıp kalkıyorum) Girilen kayıtların haliyle benzersiz id numarası olması gerekirdi. Bunun içinde doğal olarak girilen her kayıta 1 er arttırmalı id numarası verdim. Bunun için kontroller yardımı ile daha önceden xml içine kaydedilmiş id leri alıp üzerine +1 ekleyerek gerçekleştirdim. Size sorayım, database deki gibi kaydedilmiş veriyi xml dosyamıza kaydettiğimiz veriyi silip başka veri eklediğimizde bu şekildeki senaryoda kaç tane id varsa o sayının 1 fazlası ekleneceği için daha önce kayıt edilmiş id numaraları kayıt eklenecekti.

Örneği yorumlarsak 10 adet kayıt eklendiğini var sayalım. 11. kayıt id si 10+1 yani 11 id no olarak kayıt edilecek. 7 numaralı id kayıtı sildiğimiz de 11. kayıt, xml dosyamızın içinde toplamda 9 kayıt olduğu için id si 9+1 yani 10 olarak kayıt edilecek. Xml dosyamıza dönüp baktığımızda iki tane 10 numaralı id kayıtı olacak. Ee nerde kaldı bunun benzersiz kayıtı ? İşte böyle bir senaryoda basit bir yöntem işimizi halledebilecek.

Xml dosyasına kaydedilen verilerin yalnızca id numaralarını alarak içlerinden en büyüğünü alıp +1 ekleyerek yeni kayıt oluşturabiliriz. Konuyu uzattığım özür dileyerek en büyük sayıyı bulma işine yarayan koda geçmek istiyorum.

Xml den alınan verileri combobox içine ekleyip içindeki verileri döndürerek Array.Sort ile en büyük sayıyı belirleyebiliriz. Xml dosya okuma kısmını konu karışmaması için atlamak istiyorum (Xml dosya okuma burada ki makale yardımı ile xml veriyi combobox içine yazdırabilirsiniz)

[cc lang=”c#”] int[] sayilar = new int[comboBox1.Items.Count];

for (int i = 0; i < comboBox1.Items.Count; i++) { string eklenen = comboBox1.Items[i].ToString(); sayilar[i] = int.Parse(eklenen); } Array.Sort(sayilar); int enbuyuksayi = sayilar[sayilar.Length - 1]; MessageBox.Show(enbuyuksayi.ToString());[/cc]

ListView değerleri toplama

Listelemek için en çok kullandığımız ListView kontrolünde listelediğimiz, örneğin; ürün, fiyat listesi vs. ıvırzırvırın toplam fiyatını hesaplamak isteyebiliriz. Bunu nasıl yaparız, tam olarak neyi ima ettiğimi anlamak için resimdeki gibi form ekranına 2 textbox, 2 buton, bir kaç label ve bir adet ListView sürükleyin.

Örneklemek için ListView’e birkaç ürün ve fiyat bilgisi girmek üzere textboxları kullandım. Ekle butonuna çift tıklayıp Textbox’dan ListView’e değer girmek için;

[cc lang=”c#”]
ListViewItem lv = new ListViewItem();
lv.Text = txtadi.Text;
lv.SubItems.Add(txtfiyat.Text);
listView1.Items.Add(lv);

[/cc]

ListView’e ürün ve fiyat bilgisini ekletmeyi başardıktan sonra topla butonu ile buradaki ürünlerin toplam fiyatını bulalım;
[cc lang=”c#”]double toplam = 0;

double[] topla = new double[listView1.Items.Count]; // sonuç ondalıklı değer çıkabilir, işimizi sağlama alabilmek için double kullandık

for (int i = 0; i < listView1.Items.Count; i++) //Listviewdeki tüm değerleri alabilmek için for kullandık { topla[i] = Convert.ToDouble(listView1.Items[i].SubItems[1].Text.ToString());// burada dikkat edilmesi gereken, SubItems değeri 2 kolon olduğu için 0. kolon ürünün adı 1. kolon ise fiyatı göstermekte toplam = toplam + topla[i]; } lblsonuc.Text = Convert.ToString(toplam);[/cc] Gerekli açıklamayı kod içinde bulabilirsiniz. Topla dediğimizde sonucu label' a yazdırdık. Cemal hocamın tavsiyesi üzerine foreach kullanarak da toplama işlemi gerçekleştirilebilir.