C#的DataTable操作方法
1.将泛型集合类转换成DataTable(表中无数据时使用):
public static DataTable NullListToDataTable(IList list) { var result = new DataTable(); if (list.Count <= 0) return result; var propertys = list[0].GetType().GetProperties(); foreach (var pi in propertys) { if (pi != null) { result.Columns.Add(pi.Name, pi.PropertyType); } } for (var i = 0; i < list.Count; i++) { var tempList = new ArrayList(); foreach (var pi in propertys) { var obj = pi.GetValue(list[i], null); tempList.Add(obj); } var array = tempList.ToArray(); result.LoadDataRow(array, true); } return result; }
2.将泛型集合类转换成DataTable(表中有数据时使用):
public static DataTable NoNullListToDataTable<T>(IList<T> list) { var ds = new DataSet(); var dt = new DataTable(typeof(T).Name); var myPropertyInfo = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var t in list) { if (t == null) continue; var row = dt.NewRow(); for (int i = 0, j = myPropertyInfo.Length; i < j; i++) { var pi = myPropertyInfo[i]; var name = pi.Name; if (dt.Columns[name] != null) continue; DataColumn column; if (pi.PropertyType.UnderlyingSystemType.ToString() == "System.Nullable`1[System.Int32]") { column = new DataColumn(name, typeof(int)); dt.Columns.Add(column); if (pi.GetValue(t, null) != null) row[name] = pi.GetValue(t, null); else row[name] = DBNull.Value; } else { column = new DataColumn(name, pi.PropertyType); dt.Columns.Add(column); row[name] = pi.GetValue(t, null); } } dt.Rows.Add(row); } ds.Tables.Add(dt); return ds.Tables[0]; }
3.表中有数据或无数据时使用,可排除DATASET不支持System.Nullable错误:
public static DataTable ToDataTable<T>(IList<T> list) { if (list == null || list.Count <= 0) { var result = new DataTable(); object temp; if (list == null || list.Count <= 0) return result; var propertys = list[0].GetType().GetProperties(); foreach (var pi in propertys) { { result.Columns.Add(pi.Name, pi.PropertyType); } } for (var i = 0; i < list.Count; i++) { var tempList = new ArrayList(); foreach (var pi in propertys) { var obj = pi.GetValue(list[i], null); tempList.Add(obj); } var array = tempList.ToArray(); result.LoadDataRow(array, true); } return result; } var ds = new DataSet(); var dt = new DataTable(typeof(T).Name); var myPropertyInfo = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var t in list) { if (t == null) continue; var row = dt.NewRow(); for (int i = 0, j = myPropertyInfo.Length; i < j; i++) { var pi = myPropertyInfo[i]; var name = pi.Name; if (dt.Columns[name] != null) continue; DataColumn column; if (pi.PropertyType.UnderlyingSystemType.ToString() == "System.Nullable`1[System.Int32]") { column = new DataColumn(name, typeof(int)); dt.Columns.Add(column); if (pi.GetValue(t, null) != null) row[name] = pi.GetValue(t, null); else row[name] = DBNull.Value; } else { column = new DataColumn(name, pi.PropertyType); dt.Columns.Add(column); row[name] = pi.GetValue(t, null); } } dt.Rows.Add(row); } ds.Tables.Add(dt); return ds.Tables[0]; }
4.合并相同的DataTable:
public static DataTable MergeSameDatatable(DataTable dataTable1, DataTable dataTable2) { var newDataTable = dataTable1.Clone(); var obj = new object[newDataTable.Columns.Count]; for (var i = 0; i < dataTable1.Rows.Count; i++) { dataTable1.Rows[i].ItemArray.CopyTo(obj, 0); newDataTable.Rows.Add(obj); } for (var i = 0; i < dataTable2.Rows.Count; i++) { dataTable2.Rows[i].ItemArray.CopyTo(obj, 0); newDataTable.Rows.Add(obj); } return new DataTable(); }
5.将两个列不同的DataTable合并成一个新的DataTable :
public static DataTable UniteDataTable(DataTable dt1, DataTable dt2, string dtName) { var dt3 = dt1.Clone(); for (var i = 0; i < dt2.Columns.Count; i++) { dt3.Columns.Add(dt2.Columns[i].ColumnName); } var obj = new object[dt3.Columns.Count]; for (int i = 0; i < dt1.Rows.Count; i++) { dt1.Rows[i].ItemArray.CopyTo(obj, 0); dt3.Rows.Add(obj); } if (dt1.Rows.Count >= dt2.Rows.Count) { for (var i = 0; i < dt2.Rows.Count; i++) { for (var j = 0; j < dt2.Columns.Count; j++) { dt3.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString(); } } } else { for (var i = 0; i < dt2.Rows.Count - dt1.Rows.Count; i++) { var dr3 = dt3.NewRow(); dt3.Rows.Add(dr3); } for (var i = 0; i < dt2.Rows.Count; i++) { for (var j = 0; j < dt2.Columns.Count; j++) { dt3.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString(); } } } dt3.TableName = dtName; return dt3; }
6.Datatable 转 List<Dictionary<string, object>:
public static List<Dictionary<string, object>> DataTableToListDictory(DataTable table) { var ld = new List<Dictionary<string, object>>(); for (var i = 0; i < table.Rows.Count; i++) { var dic = new Dictionary<string, object>(); for (var j = 0; j < table.Columns.Count; j++) { dic.Add(table.Columns[j].ColumnName, table.Rows[i][j]); } ld.Add(dic); } return ld; }
感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接。如果需要获取最新的优秀.NET博文,请关注微信公众号“DotNet技术分享”。
爱知求真,静心钻研,虚心学习,务实创新,细致平和。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App