【小知识】DataTable 转 List -----------点滴之水,汇涓涓细流,成汪洋大海_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 【小知识】DataTable 转 List -----------点滴之水,汇涓涓细流,成汪洋大海

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

 2015/5/14 11:10:08  moonPeng  程序员俱乐部  我要评论(0)
  • 摘要:在大部分时候我们从ADO中得到的数据都是DataTable、DataSet数据源,然而有强迫症的同学老是喜欢折腾,硬是要把它转换为实体集合,说是DataTable效率差云云,于是乎收到了同化。必要信息1,数据实体publicclassUserInfo{publicintID{get;set;}publicstringname{get;set;}}2,数据源(想象成从库中得到的数据)DataTabledt=newDataTable();dt.Columns.Add(newDataColumn
  • 标签: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去赋值?

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

发表评论
用户名: 匿名