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. springMVC4 注解配置实例

    结构: maven配置: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:// ...

  2. 如何用js得到当前页面的url信息方法(JS获取当前网址信息)

    设置或获取对象指定的文件名或路径. alert(window.location.pathname) 设置或获取整个 URL 为字符串. alert(window.location.href); 设置或 ...

  3. 谢欣伦 - OpenDev原创例程 - 时间同步Time Sync

    很久以前就发现系统自带的时间同步功能很弱,更新时间总是不成功.索性编写一个小软件来更新系统时间,正好用上了我之前写的代码,相关代码可参见文章<化繁为简系列原创教程 - 通信专题 - 无连接套接字 ...

  4. 爬虫初探(1)之urllib.request

    -----------我是小白------------ urllib.request是python3自带的库(python3.x版本特有),我们用它来请求网页,并获取网页源码. # 导入使用库 imp ...

  5. 初识 Html5

    1.1认识HTML5 HTML5并不仅仅只是做为HTML标记语言的一个最新版本,更重要的是它制定了Web应用开发的一系列标准,成为第一个将Web做为应用开发平台的HTML语言. HTML5定义了一系列 ...

  6. SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/D:/MyEclipseWorkSpace/Emps/WebRoot/WEB-INF/lib/slf4j-nop-1.5.6.

    错误的是HQL语句,注意写类名属性名无误,条件无误.

  7. .NET跨平台:在Linux Ubuntu上编译coreclr/corefx/dnx(20150617)

    编译时间:北京2015年6月17日上午 操作系统:Ubuntu 14.04.2 LTS Mono版本:Mono JIT compiler version 4.3.0 (master/3445ac5 T ...

  8. Some practices to write better C#/.NET code(译)

    C#(.NET)中有关编码的一些建议,原文地址:http://www.codeproject.com/Articles/539179/Some-practices-to-write-better-Cs ...

  9. iOS开发系列--IOS程序开发概览

    概览 终于到了真正接触IOS应用程序的时刻了,之前我们花了很多时间去讨论C语言.ObjC等知识,对于很多朋友而言开发IOS第一天就想直接看到成果,看到可以运行的IOS程序.但是这里我想强调一下,前面的 ...

  10. 迷你MVVM框架 avalonjs 入门教程

    新官网 请不要无视这里,这里都是链接,可以点的 OniUI组件库 学习教程 视频教程: 地址1 地址2 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定 作用域绑定(ms-contro ...