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. ABC294Ex K-Coloring

    Statement 对一张简单无向图进行 \(k\) 染色,满足对于每条边的两个端点颜色不同,求方案数. \(n,m\leq 30\). Solution 无向图 \(k\) 染色问题,很经典的问题. ...

  2. 基于SqlSugar的开发框架循序渐进介绍(29)-- 快速构建系统参数管理界面-Vue3+ElementPlus

    在随笔<基于SqlSugar的开发框架循序渐进介绍(28)-- 快速构建系统参数管理界面>中介绍了基于SqlSugar开发框架,构建系统参数管理的后端API部分,以及WInform界面部分 ...

  3. AI 绘画基础 - 细数 Stable Diffusion 中的各种常用模型 【🧙 魔导士装备图鉴】

    AI 绘画新手魔导士在刚开始玩 Stable Diffusion 时总会遇到各种新的概念,让人困惑,其中就包括各种模型和他们之间的关系. 魔法师入门得先认识各种法师装备(各种模型),让我们遇到问题知道 ...

  4. 2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。 示例 1: 输入: n = 5 输出: 2 解释: 5 = 2 + 3,共有两组连续整数([5],[2,

    2022-09-09:给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 . 示例 1: 输入: n = 5 输出: 2 解释: 5 = 2 + 3,共有两组连续整数([5],[2,3 ...

  5. 2022-08-21:以下go语言代码输出什么?A:0;B:panic;C:不知道。 package main var n = -99 func main() { m := make(map[

    2022-08-21:以下go语言代码输出什么?A:0:B:panic:C:不知道. package main var n = -99 func main() { m := make(map[stri ...

  6. 2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度, 所有砖块等高等宽,只有长度有区别, 每一层可以用1块或者2块砖来摆, 要求每一层的长度一样, 要求必须使用所有的砖块, 请问最多

    2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度, 所有砖块等高等宽,只有长度有区别, 每一层可以用1块或者2块砖来摆, 要求每一层的长度一样, 要求必须使用所有的砖块, 请问最多 ...

  7. c#构建具有用户认证与管理的socks5代理服务端

    Socks 协议是一种代理 (Proxy) 协议, 例如我们所熟知的 Shdowsocks 便是 Socks 协议的一个典型应用程序, Socks 协议有多个版本, 目前最新的版本为 5, 其协议标准 ...

  8. 【工作随手记】并发之synchronized

    synchronized对于java同学肯定都是耳熟能详的必修课了.但是不管对于新手还是老手都有一些容易搞错的点.这里权做一点记录. 锁的是代码还是对象? 同步块一般有两种写法. 1是直接加以方法体上 ...

  9. Express实战个人订阅号实现网站登录

    今天我们来实现一个使用个人订阅号实现网站的功能,后端使用的是 express .其它框架原理基本一致,只是定义路由或返回响应数据部分代码跟 express 有所出入.先来一波效果图: 1. 前言 20 ...

  10. v8 study

    v8环境搭建看这里 现在的v8采用的是Ignition(JIT生成) + TurboFan(优化) v8调试 安装pwngdb git clone https://github.com/pwndbg/ ...