1.将泛型集合类转换成DataTable(表中无数据时使用):

  public static DataTable NullListToDataTable(IList list)
{
var result = new DataTable();
if (list.Count <= ) return result;
var propertys = list[].GetType().GetProperties();
foreach (var pi in propertys)
{
if (pi != null)
{
result.Columns.Add(pi.Name, pi.PropertyType);
}
}
for (var i = ; i < list.Count; i++)
{
var tempList = new ArrayList();
foreach (var pi in propertys)
{
var obj = pi.GetValue(list[i], null);
tempList.Add(obj);
}
var array = tempList.ToArray();
result.LoadDataRow(array, true);
}
return result;
}

2.将泛型集合类转换成DataTable(表中有数据时使用):

 public static DataTable NoNullListToDataTable<T>(IList<T> list)
{
var ds = new DataSet();
var dt = new DataTable(typeof(T).Name);
var myPropertyInfo =
typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var t in list)
{
if (t == null) continue;
var row = dt.NewRow();
for (int i = , j = myPropertyInfo.Length; i < j; i++)
{
var pi = myPropertyInfo[i];
var name = pi.Name;
if (dt.Columns[name] != null) continue;
DataColumn column;
if (pi.PropertyType.UnderlyingSystemType.ToString() == "System.Nullable`1[System.Int32]")
{
column = new DataColumn(name, typeof(int));
dt.Columns.Add(column);
if (pi.GetValue(t, null) != null)
row[name] = pi.GetValue(t, null);
else
row[name] = DBNull.Value;
}
else
{
column = new DataColumn(name, pi.PropertyType);
dt.Columns.Add(column);
row[name] = pi.GetValue(t, null);
}
}
dt.Rows.Add(row);
}
ds.Tables.Add(dt);
return ds.Tables[];
}

3.表中有数据或无数据时使用,可排除DATASET不支持System.Nullable错误:

 public static DataTable ToDataTable<T>(IList<T> list)
{
if (list == null || list.Count <= )
{
var result = new DataTable();
object temp;
if (list == null || list.Count <= ) return result;
var propertys = list[].GetType().GetProperties();
foreach (var pi in propertys)
{
{
result.Columns.Add(pi.Name, pi.PropertyType);
}
}
for (var i = ; i < list.Count; i++)
{
var tempList = new ArrayList();
foreach (var pi in propertys)
{
var obj = pi.GetValue(list[i], null);
tempList.Add(obj);
}
var array = tempList.ToArray();
result.LoadDataRow(array, true);
}
return result;
}
var ds = new DataSet();
var dt = new DataTable(typeof(T).Name);
var myPropertyInfo =
typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var t in list)
{
if (t == null) continue;
var row = dt.NewRow();
for (int i = , j = myPropertyInfo.Length; i < j; i++)
{
var pi = myPropertyInfo[i];
var name = pi.Name;
if (dt.Columns[name] != null) continue;
DataColumn column;
if (pi.PropertyType.UnderlyingSystemType.ToString() == "System.Nullable`1[System.Int32]")
{
column = new DataColumn(name, typeof(int));
dt.Columns.Add(column);
if (pi.GetValue(t, null) != null)
row[name] = pi.GetValue(t, null);
else
row[name] = DBNull.Value;
}
else
{
column = new DataColumn(name, pi.PropertyType);
dt.Columns.Add(column);
row[name] = pi.GetValue(t, null);
}
}
dt.Rows.Add(row);
}
ds.Tables.Add(dt);
return ds.Tables[];
}

4.合并相同的DataTable:

   public static DataTable MergeSameDatatable(DataTable dataTable1, DataTable dataTable2)
{
var newDataTable = dataTable1.Clone();
var obj = new object[newDataTable.Columns.Count];
for (var i = ; i < dataTable1.Rows.Count; i++)
{
dataTable1.Rows[i].ItemArray.CopyTo(obj, );
newDataTable.Rows.Add(obj);
}
for (var i = ; i < dataTable2.Rows.Count; i++)
{
dataTable2.Rows[i].ItemArray.CopyTo(obj, );
newDataTable.Rows.Add(obj);
}
return new DataTable();
}

5.将两个列不同的DataTable合并成一个新的DataTable :

 public static DataTable UniteDataTable(DataTable dt1, DataTable dt2, string dtName)
{
var dt3 = dt1.Clone();
for (var i = ; i < dt2.Columns.Count; i++)
{
dt3.Columns.Add(dt2.Columns[i].ColumnName);
}
var obj = new object[dt3.Columns.Count]; for (int i = ; i < dt1.Rows.Count; i++)
{
dt1.Rows[i].ItemArray.CopyTo(obj, );
dt3.Rows.Add(obj);
} if (dt1.Rows.Count >= dt2.Rows.Count)
{
for (var i = ; i < dt2.Rows.Count; i++)
{
for (var j = ; j < dt2.Columns.Count; j++)
{
dt3.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString();
}
}
}
else
{
for (var i = ; i < dt2.Rows.Count - dt1.Rows.Count; i++)
{
var dr3 = dt3.NewRow();
dt3.Rows.Add(dr3);
}
for (var i = ; i < dt2.Rows.Count; i++)
{
for (var j = ; j < dt2.Columns.Count; j++)
{
dt3.Rows[i][j + dt1.Columns.Count] = dt2.Rows[i][j].ToString();
}
}
}
dt3.TableName = dtName;
return dt3;
}

6.Datatable 转 List<Dictionary<string, object>:

 public static List<Dictionary<string, object>> DataTableToListDictory(DataTable table)
{
var ld = new List<Dictionary<string, object>>();
for (var i = ; i < table.Rows.Count; i++)
{
var dic = new Dictionary<string, object>();
for (var j = ; j < table.Columns.Count; j++)
{
dic.Add(table.Columns[j].ColumnName, table.Rows[i][j]);
}
ld.Add(dic);
}
return ld;
}

C#的DataTable操作方法的更多相关文章

  1. c#常用的Datable转换为json,以及json转换为DataTable操作方法

    #region  DataTable 转换为Json字符串实例方法 /// <summary> /// GetClassTypeJosn 的摘要说明 /// </summary> ...

  2. Datatable的操作方法

    DataTable操作相关内容: 对DataTable 的一些操作在dataTable中最容易想到的是用for循环来操作,但事实不到万不得已是不会用for循环的,因为效率一般不高. 1. 取行-取行一 ...

  3. C#中DataTable转化为List<T>解析

    在.net项目中使用到DataTable和List<T>集合的地方较多, 泛型的好处: 它为使用c#语言编写面向对象程序增加了极大的效力和灵活性.不会强行对值类型进行装箱和拆箱,或对引用类 ...

  4. C#利用SqlDataAdapte对DataTable进行批量数据操作

    C#利用SqlDataAdapte对DataTable进行批量数据操作,可以让我们大大简化操作数据的代码量,我们几乎不需要循环和不关心用户到底是新增还是修改,更不用编写新增和修改以及删除的SQL语句, ...

  5. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  6. 将datatable导出为excel的三种方式(转)

    一.使用Microsoft.Office.Interop.Excel.DLL 需要安装Office 代码如下:  2         public static bool ExportExcel(Sy ...

  7. DataTable 转换成 Json的3种方法

    在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>.DataTable转换为Json格式.特别在使用Extjs框架的时候,A ...

  8. C#中将DataTable导出为HTML的方法

    今天我要向大家分享一种将DataTable导出为到HTML格式的方法.有时我们需要HTML格式的输出数据, 以下代码就可以帮助我们达到目的,. 首先,我们要绑定DataTable和 DataGridV ...

  9. DataTable转换成IList<T>的简单实现

    DataTable的无奈 很多时候,我们需要去操作DataTable.但DataTable的操作,实在是太不方便了.Linq?lambda表达式?统统没有... 特别是对现有结果集做进一步筛选,这样的 ...

随机推荐

  1. 疯狂C#~伴随着我的库存管理¥

    每次的等待都是期待下一次的勃发!但激进的我非常想和大家学习一些东西,所以特地的分享了一个库存管理, 生活中容易运用的很多,但现在的学业希望能够得到各界人士的帮助!!! 首先:会有几个类来让它们协调 ( ...

  2. 学习建模 - UML

    最轻量级的工具下载地址 http://staruml.io/download 下载解压依赖:libgcrypt11 https://pan.baidu.com/s/1i3wb6M5 学习地址 http ...

  3. VB.net 2010下关联与程序图标设置

    '*************************************************************************'**模 块 名:VB.net 2010下关联与程序 ...

  4. jquery.ajax

    var params = {};//定义一个数组 var USERNAME= $("#USERNAME").val(); params["USERNAME"]= ...

  5. iOS开发中手机号码和价格金额有效性判断及特殊字符的限制

    在实际开发过程中,经常会遇到些不能让用户随便地输入手机号码,对输入的手机号码的正确判断:有些输入框只能输入数字,不能输入字母或特殊字符:还有些如价格金额之类的就只能输入数字和小数点且小数点后面保留两位 ...

  6. ASP.NET Core 文件上传

    前言 上篇博文介绍了怎么样在 asp.net core 使用 Redis 和 Protobuf 进行 Session缓存.本篇的是开发过程中使用的一个小功能,怎么做单文件和多文件上传. 如果你觉得对你 ...

  7. Visual Studio 2013 Web开发

    cnbeta新闻:微软正式发布Visual Studio 2013 RTM版,微软还发布了Visual Studio 2013的最终版本..NET 4.5.1以及Team Foundation Ser ...

  8. 剑指Offer面试题:28.连续子数组的最大和

    一.题目:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为{1,-2,3 ...

  9. 【NodeJS 学习笔记04】新闻发布系统

    前言 昨天,我们跟着这位大哥的博客(https://github.com/nswbmw/N-blog/wiki/_pages)进行了nodeJS初步的学习,最后也能将数据插入数据库了 但是一味的跟着别 ...

  10. Atitit 动态调用webservice与客户端代理方式调用

    Atitit 动态调用webservice与客户端代理方式调用 方式1: 使用call.invoke  直接调用WSDL,缺点:麻烦,不推荐--特别是JAVA调用.NET的WS时,会有不少的问题需要解 ...