C# 常用工具方法之DataTable(一)
1、DataTable 转 泛型T的List
/// <summary>
/// 数据集DataTable转换成List集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dtTemp"></param>
/// <returns></returns>
public static List<T> ToListByDataTable<T>(DataTable dtTemp)
{
if (dtTemp == null || dtTemp.Rows.Count == )
{
return null;
}
List<T> lstResult = new List<T>(); for (int j = , l = dtTemp.Rows.Count; j < l; j++)
{
T _t = (T)Activator.CreateInstance(typeof(T));
PropertyInfo[] propertys = _t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
for (int i = , k = dtTemp.Columns.Count; i < k; i++)
{
// 属性与字段名称一致的进行赋值
if (pi.Name.ToLower().Equals(dtTemp.Columns[i].ColumnName.ToLower()))
{
if (dtTemp.Rows[j][i] != DBNull.Value)
{
switch (pi.PropertyType.ToString())
{
case "System.Int32":
pi.SetValue(_t, Nall.ToInt(dtTemp.Rows[j][i].ToString()), null);
break;
case "System.Int64":
pi.SetValue(_t, Nall.ToLong(dtTemp.Rows[j][i].ToString()), null);
break;
case "System.DateTime":
pi.SetValue(_t, Nall.ToDateTime(dtTemp.Rows[j][i].ToString()), null);
break;
case "System.String":
pi.SetValue(_t, dtTemp.Rows[j][i].ToString(), null);
break;
case "System.Boolean":
pi.SetValue(_t, Nall.ToBoolean(dtTemp.Rows[j][i].ToString()), null);
break;
case "System.Guid":
pi.SetValue(_t, Nall.ToGuid(dtTemp.Rows[j][i].ToString()), null);
break;
case "System.Single":
pi.SetValue(_t, Convert.ToSingle(dtTemp.Rows[j][i].ToString()), null);
break;
case "System.Double":
pi.SetValue(_t, Convert.ToDouble(dtTemp.Rows[j][i].ToString()), null);
break;
case "System.Object":
pi.SetValue(_t, dtTemp.Rows[j][i], null);
break;
}
}
else
{
switch (pi.PropertyType.ToString())
{
case "System.Int32":
pi.SetValue(_t, -, null);
break;
case "System.Int64":
pi.SetValue(_t, -, null);
break;
case "System.DateTime":
pi.SetValue(_t, new DateTime(0x76c, , ), null);
break;
case "System.Boolean":
pi.SetValue(_t, false, null);
break;
case "System.Guid":
pi.SetValue(_t, Guid.Empty, null);
break;
case "System.Single":
pi.SetValue(_t, 0.0f, null);
break;
case "System.Double":
pi.SetValue(_t, 0.0, null);
break;
case "System.String":
pi.SetValue(_t, string.Empty, null);
break;
default:
pi.SetValue(_t, null, null);
break;
}
}
break;
}
}
}
lstResult.Add(_t);
}
return lstResult;
}
2、DataTable 转 HashTable
/// <summary>
/// DataTable转HashTable
/// </summary>
/// <param name="dt"></param>
/// <param name="key"></param>
/// <returns></returns>
public static Hashtable ToHashtableByDataRow(DataTable dt, int key)
{
Hashtable ht = new Hashtable();
for (int i = ; i < dt.Columns.Count; i++)
{
ht.Add(dt.Columns[i].ColumnName, dt.Rows[key][i]);
}
return ht;
}
3、DataTable 转 HashTable
/// <summary>
/// 转换哈希表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dt"></param>
/// <returns></returns>
public static List<Hashtable> ToHashtableByDataTable<T>(DataTable dt)
{
List<Hashtable> listht = new List<Hashtable>();
for (int i = ; i < dt.Rows.Count; i++)
{
Hashtable ht = new Hashtable();
ht.Add(i, dt.Rows[i]);
listht.Add(ht);
}
return listht;
}
4、DataTable 按照某列进行条件拆分
/// <summary>
/// 拆分Dt,返回相同数据结构的多个Dt
/// [Excel需要去掉第一行标题]
/// </summary>
/// <param name="dt">原始数据Dt</param>
/// <param name="condition">第几列数据,按照这一列进行拆分</param>
/// <param name="orderstr">排序条件,DataView的排序条件</param>
/// <returns></returns>
public static List<DataTable> SplitDtSameStruct(DataTable dt,int columnnum,string orderstr) {
//定义返回对象
List<DataTable> listDt = new List<DataTable>();
//按照条件进行筛选
List<string> conditionstr = new List<string>();
foreach (DataRow dr in dt.Rows)
{
//筛选字段的值
string key = dr["Column"+ columnnum].ToString();
//不存在新增进条件conditionstr中
if (!isExit(conditionstr,key)) {
conditionstr.Add(key);
}
}
//根据条件conditionstr集合进行拆分dt
//1、将dt数据源按照字段排序
dt.Columns.Add();
DataView view = new DataView(dt);
//正序排列
view.Sort = orderstr;//"Column"+ columnnum + " ASC";
dt = view.ToTable();
foreach (string str in conditionstr)
{
//按照条件进行抽取数据
DataRow[] dr = dt.Select("Column"+ columnnum + "='"+str+"'");
//抽出的数据存入临时的tempdt中
DataTable tempdt = new DataTable();
tempdt = dt.Clone();//拷贝框架
for (int i = ; i < dr.Length; i++)
{
tempdt.ImportRow((DataRow)dr[i]);
}
//tempdt存入返回对象listDt中
listDt.Add(tempdt);
}
return listDt;
}
日常工作常遇到的utils中积累的代码,可以优化的地方希望多多指教!
C# 常用工具方法之DataTable(一)的更多相关文章
- jQuery常用工具方法
前面的话 jQuery提供一些与元素无关的工具方法,不必选中元素,就可以直接使用这些方法.如果理解原生javascript的继承原理,那么就能理解工具方法的实质.它是定义在jQuery构造函数上的方法 ...
- JavaScript常用工具方法
JavaScript常用工具方法 1.日期格式化 2.将日期字符串转换为Date,字符串格式为(yyyy-mm-dd hh:mm:ss) 3.JS获取当天00:00:00时间和23:59:59的时间 ...
- JavaScript 深入学习及常用工具方法整理 ---- 01.浮点数
在JavaScript中是不区分整数值和浮点数值的,其中所有的数字均用浮点数值表示.JavaScript采用IEEE 754标准(有兴趣可以浏览网络规范分类下的IEEE 754标准,需要原文件请在留言 ...
- C# 枚举常用工具方法
/// <summary> /// 获取枚举成员描述信息及名称 /// 返回:IDictionary /// Value:描述信息 /// Key:值 /// </summary&g ...
- Asp.net常用开发方法之DataTable/DataReader转Json格式代码
public static string JsonParse(OleDbDataReader dataReader) //DataRead转json { StringBuilder jsonStrin ...
- java常用工具方法2
/* * Copyright 2005 Joe Walker * * Licensed under the Apache License, Version 2.0 (the "License ...
- JavaScript常用工具方法封装
因为工作中经常用到这些方法,所有便把这些方法进行了总结. JavaScript 1. type 类型判断 isString (o) { //是否字符串 return Object.prototype. ...
- jquery 常用工具方法
inArray(value, array [, fromIndex ])方法类似于原生javascript的indexOf()方法,没有找到匹配元素时它返回-1.如果数组第一个元素匹配参数,那么$.i ...
- Spring常用工具方法备忘录
1:加载配置文件 Resource resource = new ClassPathResource("log4j.properties"); Properties default ...
随机推荐
- [Caliburn.Micro专题][1]快速入门
目录 1. 什么是Caliburn.Micro? 2. 我是否需要学习CM框架? 3. 如何下手? 3.1 需要理解以下几个概念: 3.2 工程概览 3.3 示例代码 开场白:本系列为个人学习记录,才 ...
- long类型在内存中占8个字节,float类型在内存中占4个字节,为什么long还要比float小呢?
结论:数值范围大小和占用的字节没有关系. float类型的范围: 负数:-3.402823E38~-1.401298E-45 整数:0 正数:1.401298E-45~3.402823E38 long ...
- JS高阶---回调函数
1.什么函数是回调函数? 此时两者的执行并没有先后顺序 两个都是回调函数 满足三个特点就是回调 .定义了函数 .没有主动调用 .最后执行了 2.常见的回调函数有哪些? .DOM事件回调函数 .定时器回 ...
- 基于 Docker 的 MySQL 主从复制搭建
出处:https://www.jianshu.com/p/ab20e835a73f
- python 并行处理数据
来源:https://blog.csdn.net/weixin_42001089/article/details/88843152 import multiprocessing import time ...
- 洛谷 P1440 求m区间内的最小值
传送门 思路 由于数据范围很大,所以使用单调队列,和滑动窗口这道题类似 首先第一个数输出\(0\),因为第一个数之前没有数 然后通过样例我们发现,最后一个数并没有派上什么用场,所以循环\(n-1\)轮 ...
- Linux性能优化实战学习笔记:第五十五讲
一.上节回顾 上一节,我们一起学习了,应用程序监控的基本思路,先简单回顾一下.应用程序的监控,可以分为指标监控和日志监控两大块. 指标监控,主要是对一定时间段内的性能指标进行测量,然后再通过时间序列的 ...
- [LeetCode] 113. Path Sum II 二叉树路径之和之二
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- HDU 4005 The war(边双连通)
题意 给定一张 \(n\) 个点 \(m\) 条边的无向连通图,加入一条边,使得图中权值最小的桥权值最大,如果能使图中没有桥则输出 \(-1\). 思路 先对原图边双缩点,然后变成了一棵树.在 ...
- Visual Studio 调试系列7 查看变量占用的内存(使用内存窗口)
系列目录 [已更新最新开发文章,点击查看详细] 在调试期间,“内存”窗口显示应用程序正在使用的内存空间. 调试器窗口(如监视窗口.自动窗口.局部变量窗口和快速监视对话框)显示变量,这些变量存储 ...