·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> 【小知识】DataTable 转 List -----------点滴之水,汇涓涓细流,成汪洋大海

【小知识】DataTable 转 List -----------点滴之水,汇涓涓细流,成汪洋大海

作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23

【小知识】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去赋值?

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