Fork me on GitHub

List<T>转换为DataTable

   今天小姚碰到个问题,有个以前的程序直接调用数据库用dataset和datatable.但是现在想加一层Model层.获取List<T>后赋值给Table时碰到难题.

    本来我觉得这就是个简单的问题,将Table看做一张表,直接循环List后赋值即可.查了下资料才知道自己把DataTable想得太简单了....

     先说后来用到的方法一:

1
2
3
4
5
6
7
8
9
10
List<info> infos = Dal.GetInfos();
DataTable dt = new DataTable();
dt.Columns.Add("cName");
 
foreach(var info in infos)
{
     DataRow dr = dt.NewRow();
     dr["cName"] = info.Name;
     dt.Add(dr);
}

     再说网上通用的方法二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
public static class DataTableExtensions
   {
       /// <summary>
       /// 转化一个DataTable
       /// </summary>
       /// <typeparam name="T"></typeparam>
       /// <param name="list"></param>
       /// <returns></returns>
       public static DataTable ToDataTable<T>(this IEnumerable<T> list)
       {
           //创建属性的集合
           List<PropertyInfo> pList = new List<PropertyInfo>();
           //获得反射的入口
           Type type = typeof(T);
           DataTable dt = new DataTable();
           //把所有的public属性加入到集合 并添加DataTable的列
           Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, p.PropertyType); });
           foreach (var item in list)
           {
               //创建一个DataRow实例
               DataRow row = dt.NewRow();
               //给row 赋值
               pList.ForEach(p => row[p.Name] = p.GetValue(item, null));
               //加入到DataTable
               dt.Rows.Add(row);
           }
           return dt;
       }
 
       /// <summary>
       /// DataTable 转换为List 集合
       /// </summary>
       /// <typeparam name="TResult">类型</typeparam>
       /// <param name="dt">DataTable</param>
       /// <returns></returns>
       public static List<T> ToList<T>(this DataTable dt) where T : class, new()
       {
           //创建一个属性的列表
           List<PropertyInfo> prlist = new List<PropertyInfo>();
           //获取TResult的类型实例  反射的入口
           Type t = typeof(T);
           //获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表
           Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });
           //创建返回的集合
           List<T> oblist = new List<T>();
 
           foreach (DataRow row in dt.Rows)
           {
               //创建TResult的实例
               T ob = new T();
               //找到对应的数据  并赋值
               prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); });
               //放入到返回的集合中.
               oblist.Add(ob);
           }
           return oblist;
       }
 
 
       /// <summary>
       /// 将集合类转换成DataTable
       /// </summary>
       /// <param name="list">集合</param>
       /// <returns></returns>
       public static DataTable ToDataTableTow(IList list)
       {
           DataTable result = new DataTable();
           if (list.Count > 0)
           {
               PropertyInfo[] propertys = list[0].GetType().GetProperties();
               foreach (PropertyInfo pi in propertys)
               {
                   result.Columns.Add(pi.Name, pi.PropertyType);
               }
 
               for (int i = 0; i < list.Count; i++)
               {
                   ArrayList tempList = new ArrayList();
                   foreach (PropertyInfo pi in propertys)
                   {
                       object obj = pi.GetValue(list[i], null);
                       tempList.Add(obj);
                   }
                   object[] array = tempList.ToArray();
                   result.LoadDataRow(array, true);
               }
           }
           return result;
       }
 
       /**/
       /// <summary>
       /// 将泛型集合类转换成DataTable
       /// </summary>
       /// <typeparam name="T">集合项类型</typeparam>
       /// <param name="list">集合</param>
       /// <returns>数据集(表)</returns>
       public static DataTable ToDataTable<T>(IList<T> list)
       {
           return ToDataTable<T>(list, null);
       }
 
       /**/
       /// <summary>
       /// 将泛型集合类转换成DataTable
       /// </summary>
       /// <typeparam name="T">集合项类型</typeparam>
       /// <param name="list">集合</param>
       /// <param name="propertyName">需要返回的列的列名</param>
       /// <returns>数据集(表)</returns>
       public static DataTable ToDataTable<T>(IList<T> list, params string[] propertyName)
       {
           List<string> propertyNameList = new List<string>();
           if (propertyName != null)
               propertyNameList.AddRange(propertyName);
 
           DataTable result = new DataTable();
           if (list.Count > 0)
           {
               PropertyInfo[] propertys = list[0].GetType().GetProperties();
               foreach (PropertyInfo pi in propertys)
               {
                   if (propertyNameList.Count == 0)
                   {
                       result.Columns.Add(pi.Name, pi.PropertyType);
                   }
                   else
                   {
                       if (propertyNameList.Contains(pi.Name))
                           result.Columns.Add(pi.Name, pi.PropertyType);
                   }
               }
 
               for (int i = 0; i < list.Count; i++)
               {
                   ArrayList tempList = new ArrayList();
                   foreach (PropertyInfo pi in propertys)
                   {
                       if (propertyNameList.Count == 0)
                       {
                           object obj = pi.GetValue(list[i], null);
                           tempList.Add(obj);
                       }
                       else
                       {
                           if (propertyNameList.Contains(pi.Name))
                           {
                               object obj = pi.GetValue(list[i], null);
                               tempList.Add(obj);
                           }
                       }
                   }
                   object[] array = tempList.ToArray();
                   result.LoadDataRow(array, true);
               }
           }
           return result;
       }
   }
posted @   idoku  阅读(9412)  评论(5编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示