DataTable`ın Transpozunu Elde Etme

DataTable ın Transpozunu Elde Etme

Transpoz, matrislerde karşımıza çıkan bir kavramdır. Bu yazıda DataTable'a uyarlamasını görebilirsiniz.

Matrislerde geçen bir kavramdır TRANSPOZ. (İng. transpose) Türkçe'mize çevirmek istersek; matrisin ters-çarprazı, transpozu, devriği, satır-sütun değiştirilmiş hali, vb. olabilir sanırım.

Aşağıda bir matrisin transpozunu elde etmeyi görüyorsunuz.

Kısaca satırları-sütunları yer değiştiriyoruz.

Aynı işlemi DataTable üzerinde uygulamaya ne dersiniz?

Bu işlem için bir extension method yazdım.

Kodu incelerseniz daha iyi anlayacaksınız.

Sayfamıza iki adet GridView ekleyelim:

<asp:GridView ID="gvNormal" runat="server" />

<asp:GridView ID="gvTranspoz" runat="server" />

Sonra da birincisine datatable'ı, ikincisine de bu datatable'ın transpozunu yükleyelim.

protected void Page_Load(object sender, EventArgs e)
{
    var dt = DataTableHazirla();
 
    gvNormal.DataSource = dt;
    gvNormal.DataBind();
 
    gvTranspoz.DataSource = dt.ToTranspose();
    gvTranspoz.DataBind();
}
 
private DataTable DataTableHazirla()
{
    DataTable dt = new DataTable();
    dt.Columns.Add("Etkinlik_Türü"typeof(string));
    dt.Columns.Add("Öğretmen"typeof(int));
    dt.Columns.Add("Öğrenci"typeof(int));
    dt.Columns.Add("Diğer"typeof(int));
 
    var dr = dt.NewRow();
    dr["Etkinlik_Türü"] = "Müze Gezisi";
    dr["Öğretmen"] = 10;
    dr["Öğrenci"] = 15;
    dr["Diğer"] = 5;
    dt.Rows.Add(dr);
 
    dr = dt.NewRow();
    dr["Etkinlik_Türü"] = "Üniversite Gezisi";
    dr["Öğretmen"] = 3;
    dr["Öğrenci"] = 12;
    dr["Diğer"] = 4;
    dt.Rows.Add(dr);
 
    dr = dt.NewRow();
    dr["Etkinlik_Türü"] = "Tiyatro Gezisi";
    dr["Öğretmen"] = 5;
    dr["Öğrenci"] = 13;
    dr["Diğer"] = 2;
    dt.Rows.Add(dr);
 
    return dt;
}

dt.ToTranspose() gayet kolay ve anlaşılır. :)

Şimdi de extension methodu göstereyim:

public static class Extensions
{
    public static DataTable ToTranspose(this DataTable dt)
	{
        DataTable table = new DataTable();
 
        table.Columns.Add(dt.Columns[0].ColumnName.ToString());
 
        foreach (DataRow inRow in dt.Rows)
        {
            string col = inRow[0].ToString();
            table.Columns.Add(col);
        }
 
        for (int i = 1; i <= dt.Columns.Count - 1; i++)
        {
            DataRow dr = table.NewRow();
 
            dr[0] = dt.Columns[i].ColumnName.ToString();
            for (int j = 0; j <= dt.Rows.Count - 1; j++)
            {
                string val = dt.Rows[j][i].ToString();
                dr[j + 1] = val;
            }
            table.Rows.Add(dr);
        }
 
        return table;
	}
}

İşte bu kadar.

Sonuç:

Etkinlik_Türü Öğretmen Öğrenci Diğer
Müze Gezisi 10 15 5
Üniversite Gezisi 3 12 4
Tiyatro Gezisi 5 13 2

 

Etkinlik_Türü Müze Gezisi Üniversite Gezisi Tiyatro Gezisi
Öğretmen 10 3 5
Öğrenci 15 12 13
Diğer 5 4 2

 

Kolay gelsin. :)

Projeyi buradan indirebilirsiniz.

Kaynaklar:

  1. https://tr.wikipedia.org/wiki/Ters%C3%A7apraz
  2. http://www.codeproject.com/Articles/44274/Transpose-a-DataTable-using-C
  3. http://www.istmem.com/Etkinlik-Detay.aspx :)