你的位置:首页 > ASP.net教程

[ASP.net教程]【小知识】DataTable 转 List


在大部分时候我们从ADO中得到的数据都是DataTable、DataSet数据源,然而有强迫症的同学老是喜欢折腾,硬是要把它转换为实体集合,说是DataTable效率差云云,于是乎收到了同化。

必要信息

1,数据实体

public class UserInfo  {    public int ID { get; set; }    public string name { get; set; }  }

 

2,数据源(想象成从库中得到的数据)

DataTable dt = new DataTable();      dt.Columns.Add(new DataColumn("ID", typeof(int)));      dt.Columns.Add(new DataColumn("name", typeof(string)));      for (int i = 0; i < 10; i++)      {        DataRow dr = dt.NewRow();        dr["ID"] = i.ToString();        dr["name"] = "name" + i.ToString();        dt.Rows.Add(dr);      }

转换核心

转换的核心很简单,传入获取到的数据源与一个Func<DataRow, UserInfo>委托即可

public List<T> DtToList<T>(DataTable dt, Func<DataRow, T> fun)    {      List<T> list = new List<T>();      foreach (DataRow dr in dt.Rows)      {        list.Add(fun(dr));      }      return list;    }

 

在调用时只需要构建一个Func<DataRow, UserInfo>委托

Func<DataRow, UserInfo> fun = x => new UserInfo()      {        ID = Convert.ToInt32(x["ID"]),        name = x["name"].ToString()      };

 

调用

var list = DtToList<UserInfo>(dt, fun);

 

自嘲

或许有人会说,你这样转换无非是吧原先底层的转换换了个位置嘛。

确实,只是换了个位置。但是,有很多同学在做ORM的转换时通过反射或者Emit去赋值?

试想下,如果我们为一些特定的类编写一个转换的委托,让后以上述形式去给实体赋值,这岂不快哉?