自用 .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中每一 ...
随机推荐
- vue2中使用composition-api
vue2中使用composition-api https://juejin.cn/post/6874927606820274184 vue3.0 watch 函数 https://www.jiansh ...
- [双目视差] 立体校正源码分析(opencv)
文章目录 [双目视差] 立体校正源码分析(opencv) 一.源码解析 二.源码中的方法 [双目视差] 立体校正源码分析(opencv) 一.源码解析 立体校正:把实际中非共面行对准的两幅图像,校正成 ...
- MySQL概述与安装
MySQL数据库 概要: 一.MySQL数据库的概述 二.MySQL数据库的搭建 三.MySQL数据库软件的使用 四.MySQL数据类型 五.MySQL数据库数据的操作 一.初始MySQL数据库 1. ...
- 百度飞桨(PaddlePaddle)安装
注意:32位pip没有PaddlePaddle源 # 如果报下列错误,检查 Python 版本,不能过高也不要太低,并且不能是 32位的. ERROR: Could not find a versio ...
- #Powerbi函数学习 SELECTEDVALUE与ISFILTERED
Power BI中的DAX函数ISFILTERED可以用来判断一个表或者一个列是否被筛选器所影响. 这个函数的语法很简单,就是ISFILTERED(<table_or_column_name&g ...
- 2021-08-14:给定两个字符串S和T,返回S的所有子序列中有多少个子序列的字面值等于T。
2021-08-14:给定两个字符串S和T,返回S的所有子序列中有多少个子序列的字面值等于T. 福大大 答案2021-08-14: 样本对应模型. 时间复杂度:O(N^2). 空间复杂度:O(N^2) ...
- vue全家桶进阶之路24:Mock
Mock 是一个 JavaScript 库,用于生成随机数据或模拟 HTTP 请求响应,用于前端开发中的单元测试.功能测试.集成测试等场景. Mock 可以生成各种类型的数据,包括字符串.数字.布尔值 ...
- 树莓派上使用docker部署aria2,minidlna
目前在树莓派上安装aria2跟minidlna能搜到的教程基本上都是直接apt-get install安装的.现在是docker的时代了,其实这2个东西可以直接使用docker run跑起来.有什么问 ...
- 神经网络初步(Neural Network)——思想 具体实例以及代码实现
在前面我们详细的讨论过softmax损失函数以及SVM损失函数,以及应用了支持向量机进行图片分类的任务,不妨先复习一下支持向量机相关的思想内核:支持向量机想要寻求一组映射关系f(x)=wx+b,先将每 ...
- aspnetcore最最简单的接口权限认证
五月一眨眼就过去,就当凑个数吧. 场景: 一个小小的项目,需要一个后台,就展示几个列表,连用户表.角色表等都不需要设计. 之前有写过identityserver4和jwt4的demo (exercis ...