自用 .net C# List集合和DataTable互转,可自定义表头
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; namespace Common { public static class DataTable2ListHelper { /// <summary> /// DataTable转List /// </summary> /// <typeparam name="T">列表项类型</typeparam> /// <param name="dt">要转换的内存表</param> /// <returns></returns> public static List<T> DatatTable2List<T>(this DataTable dt) where T : class, new() { var list = new List<T>(); var ps = typeof(T).GetProperties(); //遍历所有DataTable的行 foreach (DataRow dr in dt.Rows) { var t = new T(); //通过反射获取T类型的所有成员 foreach (PropertyInfo pi in ps) { if (dt.Columns.Contains(pi.Name) && dr[pi.Name] != DBNull.Value) { object value = Convert.ChangeType(dr[pi.Name], pi.PropertyType); //给T类型字段赋值 pi.SetValue(t, value, null); } } //将T类型添加到集合list list.Add(t); } return list; } /// <summary> /// List转换为DataTable /// </summary> /// <typeparam name="T">列表项类型</typeparam> /// <param name="list">要转换的集合</param> /// <returns></returns> public static DataTable List2DataTable<T>(this List<T> list) where T : class { var dt = new DataTable(); var ps = typeof(T).GetProperties(); var columns = ps.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray(); dt.Columns.AddRange(columns); foreach (T t in list) { DataRow dr = dt.NewRow(); foreach (PropertyInfo pi in ps) { if (dt.Columns.Contains(pi.Name) && pi.GetValue(t) != null) { dr[pi.Name] = pi.GetValue(t); } } dt.Rows.Add(dr); } return dt; } /// <summary> /// DataTable转List /// </summary> /// <typeparam name="T">列表项类型</typeparam> /// <param name="dt">要转换的内存表</param> /// <param name="header">表头</param> /// <returns></returns> public static List<T> DatatTable2List<T>(this DataTable dt, Dictionary<string, string> header) where T : class, new() { if (!(header?.Any() ?? false)) return DatatTable2List<T>(dt); var list = new List<T>(); var ps = typeof(T).GetProperties(); foreach (DataColumn column in dt.Columns) { if (header.Where(m => m.Value == column.ColumnName).Any()) { column.ColumnName = header.Where(m => m.Value == column.ColumnName).FirstOrDefault().Key; } } //遍历所有DataTable的行 foreach (DataRow dr in dt.Rows) { var t = new T(); //通过反射获取T类型的所有成员 foreach (PropertyInfo pi in ps) { if (dt.Columns.Contains(pi.Name) && dr[pi.Name] != DBNull.Value) { object value = Convert.ChangeType(dr[pi.Name], pi.PropertyType); //给T类型字段赋值 pi.SetValue(t, value, null); } } //将T类型添加到集合list list.Add(t); } return list; } /// <summary> /// List转换为DataTable /// </summary> /// <typeparam name="T">列表项类型</typeparam> /// <param name="list">要转换的集合</param> /// <param name="header">表头</param> /// <returns></returns> public static DataTable List2DataTable<T>(this List<T> list, Dictionary<string, string> header) where T : class { if (!(header?.Any() ?? false)) return List2DataTable(list); var dt = new DataTable(); var ps = typeof(T).GetProperties(); dt.Columns.AddRange( header. Select(m => new DataColumn(m.Value, ps.Where(p => p.Name == m.Key).FirstOrDefault().PropertyType)). ToArray()); foreach (T t in list) { DataRow dr = dt.NewRow(); foreach (PropertyInfo pi in ps) { if (header.ContainsKey(pi.Name) && dt.Columns.Contains(header[pi.Name]) && pi.GetValue(t) != null) { dr[header[pi.Name]] = pi.GetValue(t); } } dt.Rows.Add(dr); } return dt; } /// <summary> /// 更换内存表表头 /// </summary> /// <param name="dt">内存表</param> /// <param name="header">表头</param> /// <returns></returns> public static DataTable ChangeHeader(this DataTable dt, Dictionary<string, string> header) { var l = dt.Columns.Count; var removeColumns = new List<DataColumn>(); for (int i = 0; i < l; i++) { DataColumn column = dt.Columns[i]; if (header.ContainsKey(column.ColumnName)) { column.ColumnName = header[column.ColumnName]; } else { removeColumns.Add(column); } } foreach (var column in removeColumns) { dt.Columns.Remove(column); } for (int i = 0; i < header.Count; i++) { var key = header.Values.ToArray()[i]; dt.Columns[key].SetOrdinal(i); } return dt; } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类