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

时间:2021-12-09 04:59:01

在大部分时候我们从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)));
            ; i < ; 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去赋值?

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