1. public static class DataTableExtensions
  2. {
  3. /// <summary>
  4. /// 转化一个DataTable
  5. /// </summary>
  6. /// <typeparam name="T"></typeparam>
  7. /// <param name="list"></param>
  8. /// <returns></returns>
  9. public static DataTable ToDataTable<T>(this IEnumerable<T> list)
  10. {
  11. //创建属性的集合
  12. List<PropertyInfo> pList = new List<PropertyInfo>();
  13. //获得反射的入口
  14. Type type = typeof(T);
  15. DataTable dt = new DataTable();
  16. //把所有的public属性加入到集合 并添加DataTable的列
  17. Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, p.PropertyType); });
  18. foreach (var item in list)
  19. {
  20. //创建一个DataRow实例
  21. DataRow row = dt.NewRow();
  22. //给row 赋值
  23. pList.ForEach(p => row[p.Name] = p.GetValue(item, null));
  24. //加入到DataTable
  25. dt.Rows.Add(row);
  26. }
  27. return dt;
  28. }
  29. /// <summary>
  30. /// DataTable 转换为List 集合
  31. /// </summary>
  32. /// <typeparam name="TResult">类型</typeparam>
  33. /// <param name="dt">DataTable</param>
  34. /// <returns></returns>
  35. public static List<T> ToList<T>(this DataTable dt) where T : class, new()
  36. {
  37. //创建一个属性的列表
  38. List<PropertyInfo> prlist = new List<PropertyInfo>();
  39. //获取TResult的类型实例  反射的入口
  40. Type t = typeof(T);
  41. //获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表
  42. Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });
  43. //创建返回的集合
  44. List<T> oblist = new List<T>();
  45. foreach (DataRow row in dt.Rows)
  46. {
  47. //创建TResult的实例
  48. T ob = new T();
  49. //找到对应的数据  并赋值
  50. prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); });
  51. //放入到返回的集合中.
  52. oblist.Add(ob);
  53. }
  54. return oblist;
  55. }
  56. /// <summary>
  57. /// 将集合类转换成DataTable
  58. /// </summary>
  59. /// <param name="list">集合</param>
  60. /// <returns></returns>
  61. public static DataTable ToDataTableTow(IList list)
  62. {
  63. DataTable result = new DataTable();
  64. if (list.Count > 0)
  65. {
  66. PropertyInfo[] propertys = list[0].GetType().GetProperties();
  67. foreach (PropertyInfo pi in propertys)
  68. {
  69. result.Columns.Add(pi.Name, pi.PropertyType);
  70. }
  71. for (int i = 0; i < list.Count; i++)
  72. {
  73. ArrayList tempList = new ArrayList();
  74. foreach (PropertyInfo pi in propertys)
  75. {
  76. object obj = pi.GetValue(list[i], null);
  77. tempList.Add(obj);
  78. }
  79. object[] array = tempList.ToArray();
  80. result.LoadDataRow(array, true);
  81. }
  82. }
  83. return result;
  84. }
  85. /**/
  86. /// <summary>
  87. /// 将泛型集合类转换成DataTable
  88. /// </summary>
  89. /// <typeparam name="T">集合项类型</typeparam>
  90. /// <param name="list">集合</param>
  91. /// <returns>数据集(表)</returns>
  92. public static DataTable ToDataTable<T>(IList<T> list)
  93. {
  94. return ToDataTable<T>(list, null);
  95. }
  96. /**/
  97. /// <summary>
  98. /// 将泛型集合类转换成DataTable
  99. /// </summary>
  100. /// <typeparam name="T">集合项类型</typeparam>
  101. /// <param name="list">集合</param>
  102. /// <param name="propertyName">需要返回的列的列名</param>
  103. /// <returns>数据集(表)</returns>
  104. public static DataTable ToDataTable<T>(IList<T> list, params string[] propertyName)
  105. {
  106. List<string> propertyNameList = new List<string>();
  107. if (propertyName != null)
  108. propertyNameList.AddRange(propertyName);
  109. DataTable result = new DataTable();
  110. if (list.Count > 0)
  111. {
  112. PropertyInfo[] propertys = list[0].GetType().GetProperties();
  113. foreach (PropertyInfo pi in propertys)
  114. {
  115. if (propertyNameList.Count == 0)
  116. {
  117. result.Columns.Add(pi.Name, pi.PropertyType);
  118. }
  119. else
  120. {
  121. if (propertyNameList.Contains(pi.Name))
  122. result.Columns.Add(pi.Name, pi.PropertyType);
  123. }
  124. }
  125. for (int i = 0; i < list.Count; i++)
  126. {
  127. ArrayList tempList = new ArrayList();
  128. foreach (PropertyInfo pi in propertys)
  129. {
  130. if (propertyNameList.Count == 0)
  131. {
  132. object obj = pi.GetValue(list[i], null);
  133. tempList.Add(obj);
  134. }
  135. else
  136. {
  137. if (propertyNameList.Contains(pi.Name))
  138. {
  139. object obj = pi.GetValue(list[i], null);
  140. tempList.Add(obj);
  141. }
  142. }
  143. }
  144. object[] array = tempList.ToArray();
  145. result.LoadDataRow(array, true);
  146. }
  147. }
  148. return result;
  149. }
  150. }

LIst和table的转换的更多相关文章

  1. 如何将jsp页面的table报表转换到excel报表导出

    假设这就是你的jsp页面: 我们会添加一个“导出到excel”的超链接,它会把页面内容导出到excel文件中.那么这个页面会变成这个样子 在此,强调一下搜索时关键词的重要性,这样一下子可以定位到文章, ...

  2. sp 数据拼接html table表转换xml,发邮件

    USE [BES_ADV] GO /****** Object: StoredProcedure [dbo].[RSP_FN_UNAPPLIED_Mail_Reminder] Script Date: ...

  3. Bootstrap Table的例子(转载)

    转载自:http://wenzhixin.net.cn/p/bootstrap-table/docs/examples.html#classes-table 使用的API: data1.json da ...

  4. Oracle数据库中日期/数字和字符之间的转换和计算

    --查出当前系统时间 select SYSDATE from table; --格式转换 -- TO_CHAR 把日期或数字转换为字符串 -- TO_CHAR(number, '格式') -- TO_ ...

  5. 【翻译】Flink Table Api & SQL —Streaming 概念 ——时间属性

    本文翻译自官网: Time Attributes   https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/str ...

  6. python运算符

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAHCCAIAAADzel4SAAAgAElEQVR4Aey9+bMcSXLnV1dmna/ejR

  7. 利用Servlet导出Excel

    -----因为Excel可以打开HTML文件,因此可以利用页面的Form表单把页面中的table内容提交给Servlet,然后后台把提交上来的table内容转换成文件流的形式,并以下载的形式转给客户端 ...

  8. 数据库多表连接方式介绍-HASH-JOIN

    1.概述 hash join是一种数据库在进行多表连接时的处理算法,对于多表连接还有两种比较常用的方式:sort merge-join 和 nested loop. 为了比较清楚的介绍hash joi ...

  9. 在SQL中使用CLR提供基本函数对二进制数据进行解析与构造

      二进制数据包的解析一般是借助C#等语言,在通讯程序中解析后形成字段,再统一单笔或者批量(表类型参数)提交至数据库,在通讯程序中,存在BINARY到struct再到table的转换. 现借助CLR提 ...

随机推荐

  1. C语言多线程pthread库相关函数说明

    线程相关操作说明 一 pthread_t pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义: typedef unsigned long int pth ...

  2. mysql表复制create table like和create table as比较

    CREATE TABLE A LIKE B 此种方式在将表B复制到A时候会将表B完整的字段结构和索引复制到表A中来. CREATE TABLE A AS SELECT x,x,x,xx FROM B ...

  3. 记录一次MyEclipse工程搭建的辛酸

    一个历史项目,使用的是Myeclipse6.5版本:这一天就砸在这个项目了. 调通web项目:内置的是tomcat插件,貌似和eclipse的server版的还不太一样. 长这个样子:

  4. TS流解析 一

    一 从TS流开始 数字电视机顶盒接收到的是一段段的码流,我们称之为TS(Transport Stream,传输流),每个TS流都携带一些信息,如Video.Audio以及我们需要学习的PAT.PMT等 ...

  5. 黄聪:Microsoft office 2013版下载、安装及破解工具下载破解教程(Windows Toolkit)

    Microsoft Office 2013(Office 15)是微软的新一代Office办公软件,全面采用Metro界面.Microsoft Office 2013官方下载(Office2013专业 ...

  6. 1027代码审计平台 3 Java maven

    使用成熟的构建工具对maven工程进行分析 官网:SCAN/Analyzing+with+SonarQube+Scanner+for+Maven 1.如下图修改settings.xml文件 1.1查看 ...

  7. sql之强制索引

    1.今天我遇到一个问题,在处理百万级数据查询的时候,一般查询会很慢. 2.第一时间想到是建立联合索引,但是数据库存在多条索引的情况下,索引的执行是全部执行. 3.所以这里要按照特定的索引执行,就必须使 ...

  8. window server2008 r2 限制远程访问用户数量

    在服务器端设置 修改组策略 1,开始-运行-gpedit.msc-计算机配置-管理模板-Windows组件-远程桌面服务-远程桌面会话主机-限制连接数量-开启并改为1

  9. canvas设置渐变

    canvas设置渐变 方法 createLinearGradient(x1, y1, x2, y2) 线性渐变 createRadialGradient(x1, y1, r1, x2, y2, r2) ...

  10. Selenium2+python自动化62-jenkins持续集成环境搭建

    前言 selenium脚本写完之后,一般是集成到jenkins环境了,方便一键执行. 一.环境准备 小编环境: 1.win10 64位 2.JDK 1.8.0_66 3.tomcat 9.0.0.M4 ...