方法1,最简单的转换

DataTable dt = new DataTable();

dt.Columns.Add("id");

dt.Columns.Add("name");

dt.Rows.Add(new object[]{ 0,"顶层菜单"});

foreach (var cm in comdList)

{

DataRow dr = dt.NewRow();

dr["id"] = cm.SYS_COMMANDS_ID;

dr["name"] = cm.TXT_COMMANDTITLE;

dt.Rows.Add(dr);

}

方法2,建立类

public static class DataTableExtensions

{

/// <summary>

/// 转化一个DataTable

/// </summary>

/// <typeparam name="T"></typeparam>

/// <param name="list"></param>

/// <returns></returns>

public static DataTable ToDataTable<T>(this IEnumerable<T> list)

{

//创建属性的集合

List<PropertyInfo> pList = new List<PropertyInfo>();

//获得反射的入口

Type type = typeof(T);

DataTable dt = new DataTable();

//把所有的public属性加入到集合 并添加DataTable的列

Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, p.PropertyType); });

foreach (var item in list)

{

//创建一个DataRow实例

DataRow row = dt.NewRow();

//给row 赋值

pList.ForEach(p => row[p.Name] = p.GetValue(item, null));

//加入到DataTable

dt.Rows.Add(row);

}

return dt;

}

/// <summary>

/// DataTable 转换为List 集合

/// </summary>

/// <typeparam name="TResult">类型</typeparam>

/// <param name="dt">DataTable</param>

/// <returns></returns>

public static List<T> ToList<T>(this DataTable dt) where T : class, new()

{

//创建一个属性的列表

List<PropertyInfo> prlist = new List<PropertyInfo>();

//获取TResult的类型实例  反射的入口

Type t = typeof(T);

//获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表

Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });

//创建返回的集合

List<T> oblist = new List<T>();

foreach (DataRow row in dt.Rows)

{

//创建TResult的实例

T ob = new T();

//找到对应的数据  并赋值

prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); });

//放入到返回的集合中.

oblist.Add(ob);

}

return oblist;

}

/// <summary>

/// 将集合类转换成DataTable

/// </summary>

/// <param name="list">集合</param>

/// <returns></returns>

public static DataTable ToDataTableTow(IList list)

{

DataTable result = new DataTable();

if (list.Count > 0)

{

PropertyInfo[] propertys = list[0].GetType().GetProperties();

foreach (PropertyInfo pi in propertys)

{

result.Columns.Add(pi.Name, pi.PropertyType);

}

for (int i = 0; i < list.Count; i++)

{

ArrayList tempList = new ArrayList();

foreach (PropertyInfo pi in propertys)

{

object obj = pi.GetValue(list[i], null);

tempList.Add(obj);

}

object[] array = tempList.ToArray();

result.LoadDataRow(array, true);

}

}

return result;

}

/**/

/// <summary>

/// 将泛型集合类转换成DataTable

/// </summary>

/// <typeparam name="T">集合项类型</typeparam>

/// <param name="list">集合</param>

/// <returns>数据集(表)</returns>

public static DataTable ToDataTable<T>(IList<T> list)

{

return ToDataTable<T>(list, null);

}

/**/

/// <summary>

/// 将泛型集合类转换成DataTable

/// </summary>

/// <typeparam name="T">集合项类型</typeparam>

/// <param name="list">集合</param>

/// <param name="propertyName">需要返回的列的列名</param>

/// <returns>数据集(表)</returns>

public static DataTable ToDataTable<T>(IList<T> list, params string[] propertyName)

{

List<string> propertyNameList = new List<string>();

if (propertyName != null)

propertyNameList.AddRange(propertyName);

DataTable result = new DataTable();

if (list.Count > 0)

{

PropertyInfo[] propertys = list[0].GetType().GetProperties();

foreach (PropertyInfo pi in propertys)

{

if (propertyNameList.Count == 0)

{

if (pi.PropertyType.FullName.Contains("Nullable")) result.Columns.Add(pi.Name);

else result.Columns.Add(pi.Name, pi.PropertyType);

}

else

{

if (propertyNameList.Contains(pi.Name))

{

if (pi.PropertyType.FullName.Contains("Nullable")) result.Columns.Add(pi.Name);

else result.Columns.Add(pi.Name, pi.PropertyType);

}

}

}

for (int i = 0; i < list.Count; i++)

{

ArrayList tempList = new ArrayList();

foreach (PropertyInfo pi in propertys)

{

if (propertyNameList.Count == 0)

{

object obj = pi.GetValue(list[i], null);

tempList.Add(obj);

}

else

{

if (propertyNameList.Contains(pi.Name))

{

object obj = pi.GetValue(list[i], null);

tempList.Add(obj);

}

}

}

object[] array = tempList.ToArray();

result.LoadDataRow(array, true);

}

}

return result;

}

}

List转Datatable 新方法的更多相关文章

  1. C#基础课程之六(临时表)DataTable使用方法

    DataTable 用法:赋取值操作,及报错情况 dataTable.Columns.Add("Name"); //Columns 对象获取该集合的全部列,添加列名. 默认stri ...

  2. DataTable.AcceptChanges方法有何用处

    提交自上次调用 AcceptChanges 以来对该表进行的全部更改. 调用 AcceptChanges 后,再用 DataAdapter.Update() 不会有不论什么新数据被更新到数据库中.那- ...

  3. C# DataTable使用方法详解--删除表数据

    在项目中常常常使用到DataTable,假设DataTable使用得当,不仅能使程序简洁有用,并且可以提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 1.添加引用 1 u ...

  4. C#DataTable使用方法详解

    在项目中常常常使用到DataTable,假设DataTable使用得当,不仅能使程序简洁有用,并且可以提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 1.添加引用 1 2 ...

  5. 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法

    若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...

  6. 遍历datatable的方法汇总

    遍历datatable的方法方法一: DataTable dt = dataSet.Tables[]; ; i < dt.Rows.Count ; i++) { string strName = ...

  7. 【Android】一种提高Android应用进程存活率新方法

    [Android]一种提高Android应用进程存活率新方法 SkySeraph Jun. 19st 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph ...

  8. Execel(导出新方法):

    #region 新方法 //var sbHtml = new StringBuilder(); //sbHtml.Append("<table border='1' cellspaci ...

  9. 交换ctrl和caps_loack的新方法

    交换ctrl和caps_loack的新方法 Table of Contents 1 过程 1 过程 debian用了几年,由于emacs的关系,一直将右ctrl和caps_lock键交换,使用的是xm ...

随机推荐

  1. 【2018年全国多校算法寒假训练营练习比赛(第四场)- E】通知小弟(强连通缩点)

    题目链接:https://www.nowcoder.com/acm/contest/76/E 题目描述         在战争时期,A国派出了许多间谍到其他国家去收集情报.因为间谍需要隐秘自己的身份, ...

  2. OLED取模笔记

  3. hdu4619

    题解: 最大独立集问题 显然对于每一对交叉的建边 然后求出最大独立集 最大独立集=n-最大匹配 代码: #include<cstdio> #include<cmath> #in ...

  4. jsp和servlet学习总结

    一.Jsp与servlet的区别: jsp是java代码嵌入html中,用java代码控制来html. Servlet完全是JAVA程序代码构成,用来流程控制和事务处理 jsp更擅长表现于页面显示,s ...

  5. Android中Application是什么?

    Application是什么? Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象, ...

  6. iphone5s越狱之后必装

    一.iphone5s完美越狱之后必装插件一览表 由于iPhone5s配置了强大的64位的A7处理器,所以在iOS7完美越狱后,不少iPhone5s用户发现之前安装的大部分人们插件在越狱后难以兼容.但是 ...

  7. css 中 overflow: hidden清楚浮动的真正原因

    1. 先上一段代码清楚浮动的代码, 外层ul设置overflow为hidden, 内层li设置float为left左浮动 <!DOCTYPE html> <html> < ...

  8. lua基础---函数

    Lua的函数功能很强大,保留了C语言的一些基本的特性,但是也有C语言没有的特性,比如,lua可以在一个函数返回多个值,我们来看看下面这个案例: 解释运行: lua test5.lua --定义一个函数 ...

  9. 第1章 Flex介绍

    * Flex Flex 是一个高效.免费的开源框架,可用于构建具有表现力的 Web应用程序,这些应用程序利用Adobe Flash Player和Adobe AIR, 可以实现跨浏览器.桌面和操作系统 ...

  10. 手贱使用shift+delete删除文件之后

    昨天整理文件夹,重新整理和命名所有项目文件,几个很久的项目代码使用shift+delete删除了. 今天早上过来说是要发版本,然后发现居然有个工程是在昨天删除的文件夹里,额,~ 然后各种百度,各种go ...