方法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. Linux CentOS服务启动

    Linux CentOS下如何确认MySQL服务已经启动   Linux CentOS一般做为服务器使用,因此,MySQL服务应该随开机自动启动的.正常情况下,查看开机自动启动的服务使用chkconf ...

  2. iptables(四)iptables匹配条件总结之一

    经过前文的总结,我们已经能够熟练的管理规则了,但是我们使用过的"匹配条件"少得可怜,之前的示例中,我们只使用过一种匹配条件,就是将"源地址"作为匹配条件. 那么 ...

  3. 集合类Collection Map

    数组与集合的区别:数组虽然也可以存储对象,但长度是固定的:集合的长度是可变的,数组中可以存储基本数据类型,集合只能存储对象. 集合特点:1.用于存储对象:  2.长度可变: 3.可存储不同对象: 一. ...

  4. 剑指offer--35.数组中只出现一次的数字

    时间限制:1秒 空间限制:32768K 热度指数:198150 本题知识点: 数组 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. class ...

  5. VS字体颜色配置

  6. Android event logcat的研究

    经常有这样的需求:在程序A启动之后,在这个程序上覆盖一个界面,让用户输入密码后才能启动程序A,这类场景主要集中在安全软件中. 那应该怎样得知某某程序启动了,系统没有相应的广播,这很难知道程序启动了. ...

  7. H264的nalu type有哪些?

    1.forbidden_bit:                             禁止位,初始为0,当网络发现NAL单元有比特错误时可设置该比特为1,以便接收方纠错或丢掉该单元. 2.nal_ ...

  8. Dojo仪表盘

    Dojo提供了非常好的仪表盘显示,效果如下: <!DOCTYPE html> <html> <head> <title>Dojo仪表盘</titl ...

  9. Flash Builder 4.6配置ASDoc

    ASDoc是Adobe自带的文档生成工具.可以生成类似JavaDoc格式的文档. 关于ASDoc详情参见官方文档: http://help.adobe.com/zh_CN/flex/using/WSd ...

  10. bzoj 2282 消防

    Written with StackEdit. Description 某个国家有\(n\)个城市,这\(n\)个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为\(z_i(z_i ...