lunedì 10 ottobre 2011

DataTable to List AsEnumerable

Ancora una volta torno sull'argomento che come sempre rimane aperto a continue evoluzioni.

In questo caso provando con l'IDE2010 e con il framework 4 sfruttando al meglio i delegati ho ottenuto questa nuova versione di quanto già scritto in precedenza.

Quello che ancora non mi convince è come riuscire a implementare un delegato generico, i modo da poter ovviare anche a questo "difetto".

ahi me in questo caso specifico non riesco a generalizzare il delegato e sono stato costretto a implementare due delegati specifici..

public class T1
{
public int Id { get; set; }
public string Value { get; set; }
}

public class TL1: List<T1>
{

}

public class T2
{
public int Id { get; set; }
public string Value { get; set; }
public string Desctiption { get; set;}
}

public class TL2 : List<T2>
{

}



class Program
{
static void Main(string[] args)
{
DataTable dt1 = new DataTable();

dt1.Columns.Add("id");
dt1.Columns.Add("Value");

for (int i = 0; i < 20; i++)
{
dt1.Rows.Add(
i.ToString(),
DateTime.Now.AddDays(i).ToString());
}

DataTable dt2 = new DataTable();

dt2.Columns.Add("id");
dt2.Columns.Add("Value");
dt2.Columns.Add("Description");

for (int i = 0; i < 20; i++)
{
dt1.Rows.Add(
i.ToString(),
DateTime.Now.AddDays(i).ToString(),
"Rows : "+ i.ToString());
}


TL1 l1 = new TL1();
l1.AddRange(
dt1.AsEnumerable().Select(ToListT1)
);

TL2 l2 = new TL2();
l2.AddRange(
dt2.AsEnumerable().Select(ToListT2)
);
}

static T1 ToListT1(DataRow r)
{
return new T1() {
Id = Convert.ToInt32(r["id"]),
Value = r["value"].ToString()
};
}

static T2 ToListT2(DataRow r)
{
return new T2() {
Id = Convert.ToInt32(r["id"]),
Value = r["value"].ToString(),
Desctiption = r["Desription"].ToString()
};
}
}



Tuttavia il risultato è decisamente buono.

Nessun commento: