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;
}
}
}

自用 .net C# List集合和DataTable互转,可自定义表头的更多相关文章

  1. 封装一个List集合和datatable相互转换的工具类(可对指定列进行重命名并且指定输出列)

    /// <summary> /// List转换为DataTable对象 /// </summary> public class ListTranTableModel { // ...

  2. List集合和JSON互转工具类

    public class JsonListUtil { /** * List<T> 转 json 保存到数据库 */ public static <T> String list ...

  3. Scala集合和Java集合对应转换关系

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...

  4. 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq

    5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...

  5. Java集合的实现细节—Set集合和Map集合

    Set:代表无序.不可重复的集合 Map:代表key-value对集合,也称为关联数组 从表面上看,Set和Map相似性很少,但实际上可以说Map集合时Set集合的扩展. 1.Set集合和Map集合的 ...

  6. 【读书笔记】【深入理解ES6】#7-Set集合和Map集合

    ES6新标准中将Set集合和Map集合添加到JS中. ES5中Set集合和Map集合 在ES5中,开发者们用对象属性来模拟这两种集合. var set = Object.create(null); s ...

  7. java基础33 Set集合下的HashSet集合和TreeSet集合

    单例集合体系: ---------| collection  单例集合的根接口--------------| List  如果实现了list接口的集合类,具备的特点:有序,可重复       注:集合 ...

  8. python集合和eval的使用

    python集合和eval的使用 创建集合 使用工厂方法 set()和 frozenset(): >>> s = set('cheeseshop') >>> s s ...

  9. List和DataTable互转

    /// <summary> /// List和DataTable互转 /// </summary> static class ListUtility { /// <sum ...

  10. 集合和Iterator迭代器

    集合 集合是java中提供的一种容器,可以用来存储多个数据. 注意: ①.集合只能存放对象.比如你存一个 int 型数据 1放入集合中, 其实它是自动转换成 Integer 类后存入的,Java中每一 ...

随机推荐

  1. 百度首页静态展示页面HTML+CSS

    一直觉得百度首页很复杂的,有那么多的东西,跟这个博主学习了之后,仿写了一下,样式好像很简单 只设置的一些组件的高度而已,不得不说,CSS真是个好东西呀 话不多说,直接上代码 <!DOCTYPE ...

  2. Mastering Regular Expressions(精通正则表达式) 阅读笔记:前言

    General Concept(一般概念) If you master the general concept of regular expressions, it's a short step to ...

  3. ai问答:使用 Vue3 组合式API 和 TS 配置 axios 拦截器 http错误状态

    通过 axios.create() 可以创建一个 axios 实例 axiosInstance,参数如下: baseURL:请求前缀 timeout:超时时间 headers:请求头 默认配置: im ...

  4. 2021-01-21:java中,HashMap的读流程是什么?

    福哥答案2020-01-21: jdk1.7读流程:1.key是否为空值null,如果为空,直接遍历table[0]链表,寻找key==null键.调用的是getForNullKey()方法.如下:1 ...

  5. 2021-07-06:股票问题3。给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意:你不能同时参与多笔交易(

    2021-07-06:股票问题3.给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格.设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易.注意:你不能同时参与多笔交易( ...

  6. Spring Cloud开发实践(五): Consul - 服务注册的另一个选择

    目录 Spring Cloud开发实践(一): 简介和根模块 Spring Cloud开发实践(二): Eureka服务和接口定义 Spring Cloud开发实践(三): 接口实现和下游调用 Spr ...

  7. SpringIOC个人笔记

    上一章讲解了SpringBoot中的 AutoConfiguration自动装配,而这一章就来讲讲自动装配时会用到的Spring三大特性之一的IOC控制反转. ​ 使用过Spring的人都熟知,Spr ...

  8. UCOS II 源码分析一

    再进行ucos操作系统源码分析前,先对ucos源码文件结构说个简单说明,只有掌握了源码文件结构才能在接下来的源码分析中逐渐感受到会当凌绝顶, 一览众山小,最后的感受就是RTOS也不是很神秘!下面以正点 ...

  9. ASP.NET Core 6框架揭秘实例演示[36]:HTTPS重定向

    HTTPS是确保传输安全最主要的手段,并且已经成为了互联网默认的传输协议.不知道读者朋友们是否注意到当我们利用浏览器(比如Chrome)浏览某个公共站点的时候,如果我们输入的是一个HTTP地址,在大部 ...

  10. 今天在内部 Galaxy 分析平台操作探针引物设计小工具程序,调用 Ensembl API 获取相关序列和信息时,发现官网 MySQL server 异常,报告问题后当天晚上就收到了回复,并且修......

    本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅读的你也加入,一起分 ...