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. xamarin 学习

    http://www.cnblogs.com/lonelyxmas/p/5174934.html http://www.cnblogs.com/phytan/p/xamarincrack2.html ...

  2. windows和linux中搭建python集成开发环境IDE——如何设置多个python环境

    本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...

  3. .NET开源OpenID和OAuth解决方案Thinktecture IdentityServer

    现代的应用程序看起来像这样: 典型的交互操作包括: 浏览器与 web 应用程序进行通信 Web 应用程序与 web Api (有时是在他们自己的有时代表用户) 通信 基于浏览器的应用程序与 web A ...

  4. Hadoop学习笔记—14.ZooKeeper环境搭建

    从字面上来看,ZooKeeper表示动物园管理员,这是一个十分奇妙的名字,我们又想起了Hadoop生态系统中,许多项目的Logo都采用了动物,比如Hadoop采用了大象的形象,所以我们可以猜测ZooK ...

  5. APOC 15 Years Celebration

    最近很忙,没有及时更新博客,也没有参加各种活动,唯一的活动就是接下来要讲的APOC 15 Years Celebration.不知不觉,自己也加入APOC有一年多了,正如大家所说“岁月是把杀猪刀”,我 ...

  6. WCF basicHttpBinding之Transport Security Mode, clientCredentialType="None"

    原创地址:http://www.cnblogs.com/jfzhu/p/4071342.html 转载请注明出处 前面文章介绍了<WCF basicHttpBinding之Message Sec ...

  7. Elasticsearch查询——布尔查询Bool Query

    Elasticsearch在2.x版本的时候把filter查询给摘掉了,因此在query dsl里面已经找不到filter query了.其实es并没有完全抛弃filter query,而是它的设计与 ...

  8. jdk1.7.0_80源码包结构

    解压源码src.zip,jdk源码结构如下所示: src |--com.sun    sun公司对jdk的实现,Oracle官方不支持,不保证跨平台(可能一些类linux有而windows没有),甚至 ...

  9. Uiautomator 2.0之UiObject2类学习小记

    1. 基础动作 1.1. 相关API介绍 API 说明 clear() 清楚编辑框内的内容 click() 点击一个对象 clickAndWait(EventCondition<R> co ...

  10. 【SQL】SQL Server登录常见问题

    很多人SQL装的很不规范,导致各种问题或者说时间长了,密码给忘记了,怎么办呢?重装? 逆天就拿几个比较常见的来说事吧,首先是各种设置的问题:(我家里用的是简易版,你们开发最好用企业版)         ...