方法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. Xcode 8 GM 编译缺失 /Users/usr/lib/libresolv.9.dylib

    原因是操作系统的文件与手机需要的不同. 解决办法是将iOS DeviceSupport里当前手机版本的Symbols的libresolv.9.dylib文件,代替编译失败项目的Build Phases ...

  2. 将本地代码提交到gitlub

    第一步:建立git仓库  cd到本地项目根路径下面,执行git命令:git  init $ git init Initialized empty Git repository in D:/my_wor ...

  3. npm的镜像和淘宝互换

    1.得到原本的镜像地址 npm get registry > https://registry.npmjs.org/ 设成淘宝的 npm config set registry http://r ...

  4. opencv:图像的掩码操作

    示例代码: #include <opencv.hpp> using namespace cv; int main() { Mat src = imread("005.jpg&qu ...

  5. RESTful api 与 Django的 restfulframework

    RESTful api 与 Django的 restfulframework 1 restful api 的基本概念 一类的资源使用一个url,不同的操作通过 请求方式处理 api -- >&g ...

  6. Android Framework 简介

    Android Framework 简介 简介 之前的研究太偏向应用层功能实现了,很多原理不了解没有详记,结果被很多公司技术人员鄙视了,为了减少自己的短板,重新复习了一遍C++.java.Androi ...

  7. Ubuntu語言支持爲灰色修復方法

    Ubuntu語言支持爲灰色修復方法 在Ubuntu12.04中,在下不知爲何將 語言支持 中 應用到整個系統 和 添加語言 這2個按弄成了灰色,導致ibus不能輸入中文,現在唔將修復方法公告天下: 1 ...

  8. TF随笔-4

    >>> import tensorflow as tf>>> a=tf.constant([[1,2],[3,4]])>>> b=tf.const ...

  9. 机器学习算法实现解析——libFM之libFM的模型处理部分

    本节主要介绍的是libFM源码分析的第三部分--libFM的模型处理. 3.1.libFM中FM模型的定义 libFM模型的定义过程中主要包括模型中参数的设置及其初始化,利用模型对样本进行预测.在li ...

  10. 【MFC】MFC技巧学习 当做字典来查

    MFC技巧学习 摘自:http://www.cnblogs.com/leven20061001/archive/2012/10/17/2728023.html 1."属性页的添加:创建对话框 ...