C#’da ArrayList Sınıfının Kullanımı

ArrayList C#’ta bir class’dır. Diğer classlar gibi Arraylist’i de kullanabilmemiz için yavru değişkenini türetmeliyiz. Arraylist aslında bir dizidir.Fonksiyonlar çalışırken arkaplanda birden fazla dizi çalışır. Arraylist’i bir otosbüsü bekleyen yolcu kuyruğuna benzetebiliriz. En son gelen en arkaya geçer. Arraylist için de böyledir. En son eklenen eleman en son indisli elemandır. Eleman eklendikçe Arraylist de büyür, eleman sayısında bir sınırlama yoktur. Arraylist’in eleman türü object’tir. Bunu ilk örnekte daha iyi anlayacaksınız. Arraylist için şimdilik bu ön bilgiler yeterli. İsterseniz hemen Arraylist fonksiyonlarına geçelim.

ArrayList oluşturabilmek için projemize using System.Collections kodunu da eklemeliyiz. Bu kodla System.Collections kütüphanesini çağırmış oluruz.

Add Fonksiyonu:

ArrayList class’ından oluşturduğumuz yavru değişkene bir eleman eklemek için kullanılır. Mesela:

private void button1_Click(object sender, EventArgs e)
{
   ArrayList diziListe = new ArrayList();
   int[] dizi = new int[5] { 1, 2, 3, 4, 5 };diziListe.Add(dizi[2]);// diziListe'nin ilk elemanı 3 olur
   diziListe.Add(12); // diziListenin ikinci elemanı 12 olur
   diziListe.Add("kelime"); // dizilistenin üçüncü elemanı kelime stringi olur
   this.Text = diziListe[0].ToString();// Form'un başlığına 3 yazar
   this.Text = diziListe[1].ToString();// Form'un başlığına 12 yazar
   this.Text = diziListe[2]; // Form'un başlığına kelime yazar
}

Burada dikkat edilmesi gereken ilk nokta Add fonksiyonu ile Arraylist’e aynı anda sadece bir eleman ekleyebilmemiz. İkinci önemli nokta ise hem bir integer değeri ekledik hem de bir string değeri ekledik. Buradan da analaşılacağı üzere oluşturduğumuz Arraylist’e object türünde değerler atabiliyoruz. Mesela biz burda diziListe isimli yavru değişkene bool, double, float, string, byte, hatta Button, listBox türünde nesneler de ekleyebiliyoruz çünkü object türü değişken hepsini kapsayabiliyor.

AddRange Fonksiyonu:

AddRange fonksiyonu Add fonksiyonuna benzemektedir. Aradaki tek fark Add ile sade bir değeri ekleyebiliyorduk. AddRange ile ise Arraylist’e bir dizinin tamamını ekleyebiliriz.

private void button1_Click(object sender, EventArgs e)
{
    ArrayList diziListe = new ArrayList();
    int[] dizi = new int[5] { 11, 21, 34, 56, 74 };
    diziListe.AddRange(dizi);textBox1.Text = diziListe[2].ToString();// textBox1’in içine 34 yazar
}

Burada bir noktayı hatırlatalım, listBox’ın elemenları da bir dizidir. Yani şunu da yapabilirdik:

diziListe.AddRange(listBox1.Items);

Bu kod ile listBox içindeki bütün değerleri Arraylist’imizin içine ekleyebiliriz.

Clear Fonksiyonu:

Arraylist içindeki bütün elemanları silmek için kullanılan bir fonksiyondur.

private void button1_Click(object sender, EventArgs e)
{
   ArrayList diziListe = new ArrayList();
   int[] dizi = new int[5] { 11, 21, 34, 56, 74 };
   diziListe.AddRange(dizi);diziliste.Clear();// diziListe'nin içine tamamen temizler
   extBox1.Text = diziListe[2].ToString();// hata verir
}

Contains Fonksiyonu:

Fonksiyona parametre olarak verilen değişkenin Arraylist içinde olup olmadığına bakar. Eğer var ise true yok ise false döndürür.

private void button1_Click(object sender, EventArgs e)
{
   ArrayList diziListe = new ArrayList();
   int[] dizi = new int[5] {1,2,3,4,5 };
   diziListe.AddRange(dizi);
   if (diziListe.Contains(Convert.ToInt32(textBox1.Text))==true)
   {
        MessageBox.Show("girilen değer diziListe içinde mevcut");
   }
   else
   {
       MessageBox.Show("girilen değer diziListe içinde yok");
   }
}


Count Fonksiyonu:

Arraylist’in eleman sayısını döndüren fonksiyondur.

private void button1_Click(object sender, EventArgs e)
{
   ArrayList diziListe = new ArrayList();
   int[] dizi = new int[] {1,2,3,4,5,6 };
   diziListe.AddRange(dizi); textBox1.Text = diziListe.Count.ToString();//textBox1'in içine 6 yazar
}

IndexOf Fonksiyonu:

Arraylist içinde istediğimiz elemanı aramak için kullanırız. Fonksiyonun üç farklı kullanımı vardır. En genel olanı parametre olarak sadece aranan elemanın kendisini alanıdır. Eğer aranan eleman Arraylist içinde var ise elemanın indis numarasını, yok ise -1 döndürür. IndexOf fonksiyonu aramaya Arraylist’in başından başlar.

private void button1_Click(object sender, EventArgs e)
{
   ArrayList diziListe = new ArrayList();
   string[] dizi = new string[5] {"aa","bb","cc","dd","ee" };// fonksiyonun parmetresi aradığımız elemandır
   diziListe.AddRange(dizi);
   int sıra; sıra = diziListe.IndexOf("cc", 0, diziListe.Count - 1);
   textBox1.Text = sıra.ToString();
}

LastIndexOf Fonksiyonu:

IndexOf fonksiyonu gibi Arraylist iinde herhangi bir elemanı aramak için kullanılır. IndexOf’tan farkı aramaya sondan başlamasıdır. Elaman sayısı çok fazla olan Arraylist’lerde aradığımız eleman sonlara daha yakınsa bu fonksiyon bize hız kazandırır. Eğer aranan eleman Arraylist içinde var ise elemanın indis numarasını, yok ise -1 döndürür.

private void button1_Click(object sender, EventArgs e)
{
   ArrayList diziListe = new ArrayList();
   string[] dizi = new string[5] {"aa","bb","cc","dd","ee" };
   diziListe.AddRange(dizi); int sıra; sıra = diziListe.LastIndexOf("dd", 0, diziListe.Count - 1); // Aramaya sondan başladığı için elemanı ikinci seferde bulur. Eğer IndexOf kullansaydık elemanı üçüncü seferde bulacaktı.
   textBox1.Text = sıra.ToString();
}

Insert Fonksiyonu:

Arraylist içinde herhangi bir aralığa eleman eklemek için kullanırız. Araya eleman eklediğimiz için Arraylist’in eleman sayısı da artmış olur (tıpkı otobüs beklerken birinin araya girmesi gibi). Fonksiyonun ilk parametresine elemanı eklemek istediğimiz indis numarasını, ikinci parametreye ise elamanı yazarız.

private void button1_Click(object sender, EventArgs e)
{
   ArrayList diziListe = new ArrayList();
   string[] dizi = new string[5] { "aa", "bb", "cc", "dd", "ee" };// diziListe.AddRange(dizi);
   diziListe.Insert(2, "ff"); // diziListenin 2 numaralı indisine ff ekledik. diziListenin eleman sayısı 6 oldu.
   textBox1.Text = diziListe[2].ToString(); // textBox1'in içine ff yazar.
}

InsertRange fonksiyonu:

Fonksiyonun Insert fonksiyonunda tek farkı araya birden fazla elemanı bir seferde ekleyebilmesidir.

private void button1_Click(object sender, EventArgs e)
{
   ArrayList diziListe = new ArrayList();
   int[] dizi = new int[5] { 0, 1, 2, 3, 4 };
   diziListe.AddRange(dizi); int[] eklenecek=new int[3]{ 10, 11, 12 };
   diziListe.InsertRange(2, eklenecek); // diziListenin 2 numaralı indisinden sonra {10,11,12} dizisini ekledik. diziListenin eleman sayısı 8 oldu. // diziListenin son hali{0,1,10,11,12,2,3,4,5} şeklidedir.
   textBox1.Text = diziListe[2].ToString(); // textBox1'in içine 10 yazar.
}

Remove Fonksiyonu:

Fonksiyona parametre olarak girilen elemanı Arraylist’in içinde bulur ve siler. Arraylist’in eleman sayısı 1 azalmış olur.

private void button1_Click(object sender, EventArgs e)
{
   ArrayList diziListe = new ArrayList();
   int[] dizi = new int[5] { 0, 1, 2, 3, 4 };
   diziListe.AddRange(dizi);
   diziListe.Remove(3)textBox1.Text = diziListe[3].ToString(); // textBox1'in içine 4 yazar.
}

RemoveAt Fonksiyonu:

Remove fonksiyonundan tek farkı parametre olarak elemanı değil elemanın indis numarasını almasıdır.

private void button1_Click(object sender, EventArgs e)
{
   ArrayList diziListe = new ArrayList();
   int[] dizi = new int[5] { 7, 8, 9, 10, 11 };
   diziListe.AddRange(dizi); diziListe.Remove(2);
   textBox1.Text = diziListe[2].ToString(); // textBox1'in içine 10 yazar.
}

Reverse Fonksiyonu:

Arraylist’in eleman sıralamasını tersine çevirmek için kullanılır.

private void button1_Click(object sender, EventArgs e)
{
   ArrayList diziListe = new ArrayList();
   int[] dizi = new int[5] { 7, 8, 9, 10, 11 };
   diziListe.AddRange(dizi); diziListe.Reverse();// dizi bundan sonra {11,10,9,8,7} halini alır.
   textBox1.Text = diziListe[2].ToString(); // textBox1'in içine 9 yazar.
}

Sort Fonksiyonu:

Arraylist’in elamanlarını küçükten büyüğe doğru sıralamak için kullanılır. Eğer elemanlar string tipinde ise alfabetik sıralama yapar.

private void button1_Click(object sender, EventArgs e)
{
   ArrayList diziListe = new ArrayList();
   string[] dizi = new string[4] { "Ankara", "İzmir", "İstanbul", "Gaziantep" };
   diziListe.AddRange(dizi); diziListe.Sort(); //dizinin son hali {"Ankara","Gaziantep","İstanbul","İzmir"} şeklinde olur.
   textBox1.Text = diziListe[3].ToString(); // textBox1'in içine İzmir yazar.
}

C# Parametreli ToString() Metodu

Bugün internette döküman okurken yeni birşey öğrendim. ToString() metodunun içine parametre ekleyerek, sayıları farklı bir şekilde string ifadesine çevirebiliyoruz. Örnekleri görünce daha iyi anlayacaksınız.

1-) C Parametresi:

long sayi = 10000000;
string deger = sayi.ToString("C");
MessageBox.Show(deger);

Bu şekilde C parametresi verdiğimizde sayıyı para birimiyle beraber yazdırır.

2-) N Parametresi:

long sayi = 10000000;
string deger = sayi.ToString("N");
MessageBox.Show(deger);

N parametresi verdiğimizde sayıyı binlik hanelere böler.

3-) D Parametresi:

long sayi = 10000000;
string deger = sayi.ToString("D11");
MessageBox.Show(deger);

D parametresi, verilen sayıyının basamak miktarını yanındaki sayıya tamamlar.

4-) P  Parametresi:

long sayi = 0.50;
string deger = sayi.ToString("P");
MessageBox.Show(deger);

P parametresi ile, verilen double sayı, yüzdelik karşılığına çevrilir.

5-) F Parametresi:

long sayi = 0.50;
string deger = sayi.ToString("N5");
MessageBox.Show(deger);

N parametresi ile virgülden sonra kaç basamak gösterileceğini belirlersiniz.

SqlBulkCopy Class kullanımı

SqlBulkCopy sınıfı, iki veritabanı arasında veya aynı veritabanı içindeki, iki tablo arasında kopyalama yapmak için kullanılan çok basit bir sınıftır. Bu sınıf ile 500.000 adet veriyi 1 dakika içerisinde kopyalayabilmektesiniz. Bu açıdan oldukça kullanışlıdır. Şimdi bir örnekte bunu inceleyelim.

İlk olarak bir Windows form açalım. Ve bir adet buton ekleyelim. Butonun click olayına şağıdaki kodları yazalım.

private void button1_Click(object sender, EventArgs e)

{

SqlConnection baglanti1 = new SqlConnection("server=localhost; initial catalog=Ticari; integrated security=true");

//ilk olarak kopyalayacağımız veritabanı için bağlantı oluşturduk.

SqlCommand komut = new SqlCommand("select * from stok", baglanti1);

baglanti1.Open();

SqlDataReader oku = komut.ExecuteReader();

DataTable dt = new DataTable();

dt.Load(oku);

oku.Close();

baglanti1.Close();

// veritabanını okuyup, bir datatable'a aktardık ve bağlantıyı kapattık.

SqlConnection baglanti2=new SqlConnection("server=localhost; initial catalog=kopyaTicari; integrated security=true");

// şimdi de hedef veritabanı için bir bağlantı oluşturduk.

// Not: Eğer kopyalayacağınız tablolar aynı veritabanı içindeyse tek bir bağlantı yeterlidir. ben farklı veritabanları arasında kopyalama yaptığım için iki farklı bağlantı oluşturdum.

SqlBulkCopy kopyalama = new SqlBulkCopy(baglanti2);

// SqlBulkCopy sınıfından bir adet nesne türettik. Dikkat ettiyseniz bağlantı olarak hedef veritabanının bağlantısını verdik.

baglanti2.Open();

kopyalama.ColumnMappings.Add("id", "id");

kopyalama.ColumnMappings.Add("Malzeme", "Malzeme");

kopyalama.ColumnMappings.Add("Adet", "Adet");

// bu üç satırda kaynak tablodaki sutunların, hedef tablodaki hangi sütunlara kopyalanacağını belirttik.

kopyalama.DestinationTableName = "dbo.kopyastok";

// hedef tablonun ismini belirttik.

kopyalama.WriteToServer(dt);

// kopyalamaya başladık.

baglanti2.Close();

}

Burda kodları tekrar açıklamayacağım zaten yanlarında hepsini açıkladım. Eklemek istediğim bir şey var. Ben burada tablonun tamamını kopyaladım. Eğer isteseydim sadece bir ya da iki sütunu da koyalayabilirdim. Bunu, sütunları eşleştirdiğimiz kod satırlarında sağlarız. Mesela aşağıdaki gibi olsaydı sadece id ve Malzeme sütunlarını kopyalamış olacaktık.

kopyalama.ColumnMappings.Add("id", "id");

kopyalama.ColumnMappings.Add("Malzeme", "Malzeme");

Son olarak şunu belirteyim, hedef veritabanını ve tabloyu daha önce kendimiz oluşturduk. Bunu istersek bir kodla da yapabiliriz ama o kısmı burada değil başka bir yazımda ele alacağım. Şimdilik bu kadar yeter 😉

C#’da access e bağlanmak ve veri çekmek

Aşağıdaki örnekte c#da access’e bağlanıp verileri bir buton sayesinde listboxa ekleyeceğiz..

1. database dosyasi (*.mdb) projenin kayıtlı olduğu klasörde bin/debug klasörünün içinde  olmalıdır.

2. data.oleb import edilmelidir.
using System.Data.OleDb;

3. bağlantıyı gerçekleştirecek kod parcasi her veri cekme isleminde kullanılacağı için bir fonksiyon halinde yazılması işleri kolaylaştıracaktır.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;

namespace WindowsFormsApplication3
{
   public partial class Form1 : Form
   {
		public Form1()	
		{
			InitializeComponent();
		}
		public OleDbConnection baglanti;
		public void Baglanti()
     {
			try
			{
				baglanti = new OleDbConnection
            ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=courses.mdb");
				baglanti.Open();
			}
			catch (OleDbException ex)
			{
				MessageBox.Show(ex.Message);
         }
		}
		private void Verileri_yazdirma()
     {
				OleDbCommand komut;
				OleDbDataReader oku;
				try
				{
					Baglanti();
					komut = new OleDbCommand();
                 komut.CommandText ="Select courseName from  course_name";
					komut.Connection = baglanti;
					oku = komut.ExecuteReader();
					while (oku.Read())
					{
						listBox1.Items.Add(oku[0]);
					}
				}
				catch (OleDbException ex)
				{
                 MessageBox.Show(ex.Message);
				}
			}
			private void button1_Click(object sender, EventArgs e)
			{
				Verileri_yazdirma();
			}
		}
}