自用 .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;
}
}
}
自用 .net C# List集合和DataTable互转,可自定义表头的更多相关文章
- 封装一个List集合和datatable相互转换的工具类(可对指定列进行重命名并且指定输出列)
/// <summary> /// List转换为DataTable对象 /// </summary> public class ListTranTableModel { // ...
- List集合和JSON互转工具类
public class JsonListUtil { /** * List<T> 转 json 保存到数据库 */ public static <T> String list ...
- Scala集合和Java集合对应转换关系
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...
- 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq
5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...
- Java集合的实现细节—Set集合和Map集合
Set:代表无序.不可重复的集合 Map:代表key-value对集合,也称为关联数组 从表面上看,Set和Map相似性很少,但实际上可以说Map集合时Set集合的扩展. 1.Set集合和Map集合的 ...
- 【读书笔记】【深入理解ES6】#7-Set集合和Map集合
ES6新标准中将Set集合和Map集合添加到JS中. ES5中Set集合和Map集合 在ES5中,开发者们用对象属性来模拟这两种集合. var set = Object.create(null); s ...
- java基础33 Set集合下的HashSet集合和TreeSet集合
单例集合体系: ---------| collection 单例集合的根接口--------------| List 如果实现了list接口的集合类,具备的特点:有序,可重复 注:集合 ...
- python集合和eval的使用
python集合和eval的使用 创建集合 使用工厂方法 set()和 frozenset(): >>> s = set('cheeseshop') >>> s s ...
- List和DataTable互转
/// <summary> /// List和DataTable互转 /// </summary> static class ListUtility { /// <sum ...
- 集合和Iterator迭代器
集合 集合是java中提供的一种容器,可以用来存储多个数据. 注意: ①.集合只能存放对象.比如你存一个 int 型数据 1放入集合中, 其实它是自动转换成 Integer 类后存入的,Java中每一 ...
随机推荐
- 白嫖GitHub Action实现开源项目CICD
什么是CI/CD?让你的项目变得更加敏捷! 在今天这个快速变化的时代,开发者们需要与时俱进,不断提升自己的工作效率.在这篇文章里,将一起探讨如何使用CI/CD和Github Action让你的项目更加 ...
- 【解决方法】ASP.NET web 提示错误:CS0103 当前上下文中不存在名称“******”
问题描述 操作环境与场景: 在 Windows 10 中 Visual Studio 2017 编写网页时,提示报错: 错误 CS0103 当前上下文中不存在名称"******" ...
- vscode取消“禁用错误波形曲线”
刚刚不小心点到了vscode的禁用错误波形曲线,导致现在没有报错提醒了,上网查了一下,重新打开错误曲线的方法是 1.按住Cctrl+shift+p 2.搜索 启用错误波形曲线,选择打开,就可以了
- 2020-12-19:系统load过高,你怎么去查?
福哥答案2020-12-20:[答案来自此链接:](http://bbs.xiangxueketang.cn/question/800)1.top命令查看该机器的负载状况.2.cd /proc/pid ...
- SQL:DATEDIFF和DATEADD函数
DATEDIFF和DATEADD函数.DATEDIFF函数计算两个日期之间的小时.天.周.月.年等时间间隔总数.DATEADD函数计算一个日期通过给时间间隔加减来获得一个新的日期.要了解更多的DATE ...
- Event Tables for Efficient Experience Replay
Abstract 事件表分层抽样(SSET),它将ER缓冲区划分为事件表,每个事件表捕获最优行为的重要子序列. 我们证明了一种优于传统单片缓冲方法的理论优势,并将SSET与现有的优先采样策略相结合,以 ...
- css预编译sass和stylus简单使用
目前css 流行的三大预编译有stylus.less . sass 说白了这些东西就是为了提高编码效率,更好的规整和简化 css代码的,相信大家less 就不用多说了用得都比较多了,在这里简单记录下s ...
- Vue+Element中Table懒加载,新增、删除操作后手动更新
Vue+Element中Table懒加载,新增.删除操作后手动更新 今天开发一个自动分类管理系统中行业类型管理,使用table tree 进行节点懒加载,遇到的问题是:使用load 进行懒加载后在ta ...
- Bioconductor 中的 R 包安装教程
Bioconductor 是一个基于 R 语言的生物信息软件包,主要用于生物数据的注释.分析.统计.以及可视化(http://www.bioconductor.org). 总所周知,Bioconduc ...
- 浙大Jarvisoj [XMAN]level6 Writeup
分析代码 初始化 0x0804A2EC:保存malloc(0xC10)返回的指针 malloc(0xC10) 0 1 ... ... value note 总数:256 已使用 note 数 0 一. ...