C#实现DataTable转换成IList的方法
程序员文章站
2022-11-24 07:56:03
本文实例讲述了c#实现datatable转换成ilist的方法。分享给大家供大家参考,具体如下:
在用c#作开发的时候经常要把datatable转换成ilist;操作da...
本文实例讲述了c#实现datatable转换成ilist的方法。分享给大家供大家参考,具体如下:
在用c#作开发的时候经常要把datatable转换成ilist;操作datatable比较麻烦,把datatable转换成ilist,以对象实体作为ilist的元素,操作起来就非常方便。
注意:实体的属性必须和数据库中的字段必须一一对应,或者数据库字段名.tolower().contains(实体属性名.tolower())
数据类型暂时至支持int、string、datetime、float、double
using system; using system.collections; using system.collections.generic; using system.data; using system.reflection; namespace tbtolisttest { public class tbtolist<t> where t : new() { /// <summary> /// 获取列名集合 /// </summary> private ilist<string> getcolumnnames(datacolumncollection dcc) { ilist<string> list = new list<string>(); foreach (datacolumn dc in dcc) { list.add(dc.columnname); } return list; } /// <summary> ///属性名称和类型名的键值对集合 /// </summary> private hashtable getcolumntype(datacolumncollection dcc) { if (dcc == null || dcc.count == 0) { return null; } ilist<string> colnamelist = getcolumnnames(dcc); type t = typeof(t); propertyinfo[] properties = t.getproperties(); hashtable hashtable = new hashtable(); int i = 0; foreach (propertyinfo p in properties) { foreach (string col in colnamelist) { if (col.tolower().contains(p.name.tolower())) { hashtable.add(col, p.propertytype.tostring() + i++); } } } return hashtable; } /// <summary> /// datatable转换成ilist /// </summary> /// <param name="dt"></param> /// <returns></returns> public ilist<t> tolist(datatable dt) { if (dt == null || dt.rows.count == 0) { return null; } propertyinfo[] properties = typeof(t).getproperties();//获取实体类型的属性集合 hashtable hh = getcolumntype(dt.columns);//属性名称和类型名的键值对集合 ilist<string> colnames = getcolumnnames(hh);//按照属性顺序的列名集合 list<t> list = new list<t>(); t model = default(t); foreach (datarow dr in dt.rows) { model = new t();//创建实体 int i = 0; foreach (propertyinfo p in properties) { if (p.propertytype == typeof(string)) { p.setvalue(model, dr[colnames[i++]], null); } else if (p.propertytype == typeof(int)) { p.setvalue(model, int.parse(dr[colnames[i++]].tostring()), null); } else if (p.propertytype == typeof(datetime)) { p.setvalue(model, datetime.parse(dr[colnames[i++]].tostring()), null); } else if (p.propertytype == typeof(float)) { p.setvalue(model, float.parse(dr[colnames[i++]].tostring()), null); } else if (p.propertytype == typeof(double)) { p.setvalue(model, double.parse(dr[colnames[i++]].tostring()), null); } } list.add(model); } return list; } /// <summary> /// 按照属性顺序的列名集合 /// </summary> private ilist<string> getcolumnnames(hashtable hh) { propertyinfo[] properties = typeof(t).getproperties();//获取实体类型的属性集合 ilist<string> ilist = new list<string>(); int i = 0; foreach (propertyinfo p in properties) { ilist.add(getkey(p.propertytype.tostring() + i++, hh)); } return ilist; } /// <summary> /// 根据value查找key /// </summary> private string getkey(string val, hashtable tb) { foreach (dictionaryentry de in tb) { if (de.value.tostring() == val) { return de.key.tostring(); } } return null; } } }
namespace tbtolisttest { //实体 public class person { public int id { set; get; } public string name { set; get; } public string age { set; get; } public string lover { set; get; } } }
using system; using system.data; namespace tbtolisttest { class program { static void main(string[] args) { tbtolist<person> tol = new tbtolist<person>(); console.writeline(); datatable dt = gettable(); tol.tolist(dt); console.read(); } public static datatable gettable() { datatable dt = new datatable(); dt.columns.add("id"); dt.columns.add("age"); dt.columns.add("lover"); dt.columns.add("name"); datarow dr = dt.newrow(); dr["id"] = 1; dr["age"] = "age1"; dr["lover"] = "lover1"; dr["name"] = "name1"; dt.rows.add(dr); datarow dr1 = dt.newrow(); dr1["id"] = 2; dr1["age"] = "age2"; dr1["lover"] = "lover2"; dr1["name"] = "name2"; dt.rows.add(dr1); return dt; } } }
更多关于c#相关内容感兴趣的读者可查看本站专题:《c#数据结构与算法教程》、《c#常见控件用法教程》、《c#面向对象程序设计入门教程》及《c#程序设计之线程使用技巧总结》
希望本文所述对大家c#程序设计有所帮助。
上一篇: C#隐藏主窗口的方法小结