自用 .net C# List集合和DataTable互转,可自定义表头
Posted 你好创造者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自用 .net C# List集合和DataTable互转,可自定义表头相关的知识,希望对你有一定的参考价值。
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; namespace AddrList.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; for (int i = 0; i < l; i++) DataColumn column = dt.Columns[i]; if (header.ContainsKey(column.ColumnName)) column.ColumnName = header[column.ColumnName]; else dt.Columns.Remove(column); return dt;
转载C#使用ToList()将数组快速转换为List集合
在C#的编程中,数组和List集合是比较常用的两个集合类,有时候因为业务需要,需要将数组集合转换为List集合,此时就可以使用C#中的 Linq的扩展方法ToList方法来实现,只需要简单的一条语句即可将数组对象转换为List集合对象。ToList方法所在的命名空间为 System.Linq里面。
例如下面有个字符串类型string的数组集合strArr,需要将之转换为List<string>类型的字符串List集合,可使用下列语句:
string[] strArr = new string[3] { "1", "2", "3" };
List<string> strList = strArr.ToList();
以上是关于自用 .net C# List集合和DataTable互转,可自定义表头的主要内容,如果未能解决你的问题,请参考以下文章
令人惊讶的性能差异:List.Contains、Sorted List.ContainsKey、DataRowCollection.Contains、Data Table.Select、DataTab