DataTable.Clone() Hakkında

15 02 2007

Belki geç kalmış bir bilgi ama yakın zamanda başıma geldiği için dikkat çekmek istedim,

Diyelim ki içinde veriler bulunan bir tabloyu çoğaltmak için DataTable.Clone() + ImportRow() yapmak istiyorsunuz, böyle bir durumda bu DataTable örneğine ait DefaultView (yani varsayılan DataView) e atanmış bir filtre (DataView.RowFilter) tanımlanmışsa bu filtrenin klonlanarak oluşturulmuş yeni DataTable’da yer almayacağını unutmamalısınız…

Örneğin :

DataTable dtOrijinal = new DataTable();
...
dtOrijinal.DefaultView.RowFilter = "Isim = 'Ahmet'";
Console.WriteLine("Orijinal Filtre: " + dtOrijinal.DefaultView.RowFilter);
...
DataTable dtClone = dtOrijinal.Clone();
Console.WriteLine("Klonun Filtresi: " + dtClone.DefaultView.RowFilter);

şeklindeki bir kod parçacığı…

Orijinal Filtre: Isim = ‘Ahmet’
Klonun Filtresi:

şeklinde bir çıktı oluşturur.

Kısaca belirtmek gerekirse klonlar veriyi içermediği gibi filtreleri de içermiyor!

Ek olarak filtrelenmiş bir DataTable’ın satırları içinde dolaşırken filtre dışında kalan satırlara da ulaşırsınız. Dolayısıyla filtre edilmiş bir DataTable’daki verileri bir klona aktarırken satırları değil de DefaultView satırlarını dolaşmalısınız.

Örneğin sadece filtre kuralına uyan satırları import etmek istenen bir durumda aşağıdaki kod parçası istenen sonucu üretmez:

foreach (DataRow dr in dtOrijinal.Rows)
{
this.dtClone.ImportRow(dr);
}

…ama aşağıdaki kod parçası ile sadece filtre kuralıana uyan satırlar alınabilir:

foreach (DataRowView drv in this.dtOrijinal.DefaultView)
{
this.dtClone.ImportRow(drv.Row);
}

Advertisements




Convert mi? Parse mı?

3 05 2006

.Net Framework 2.0 da C# ile object tipi bir nesneyi alıp bunu integer bir değere dönüştürürken acaba hangisi daha performanslıdır :


object deger = 1492;
int.Parse(deger.ToString()); // Bu mudur?
Convert.ToInt32(deger); // Yoksa bu mu?

Lutz'un Reflector'ü ile mscorlib.dll'i açıp kodları incelediğimizde kesin yargıya ulaşamıyoruz. En iyisi gözlerimizle görmek diyerek konu hakkında minik bir uygulama yazdım.

Tester Uygulaması

public partial class Form1 : Form   
{   
object kurban = 1492;   
int sonuc;      

private void btnConvertTo_Click(object sender, 
    EventArgs e)   
{   
    for (int i = 0; i < 9000000; i++)   
    {   
        sonuc = Convert.ToInt32(kurban);   
    }   
    MessageBox.Show("Bitti!");   
}      

private void btnIntParse_Click(object sender, 
    EventArgs e)   
{   
    for (int i = 0; i < 9000000; i++)   
    {   
        sonuc = int.Parse(kurban.ToString());   
    }   
    MessageBox.Show("Bitti!");   
}  

}


Sonuçlara baktığımızda "ToString + int.Parse" butonuna tıkladığımızda 6sn sonra "Bitti!" mesajını görürken, "Convert.ToInt32" butonu 1sn içinde bize "Bitti!" mesajını gösterebiliyor.

Sizce hangisi daha performanslı?