//文章出处:

http://www.cnblogs.com/hlxs/archive/2011/05/09/2087976.html 

DataTable转换成IList

在用C#作开发的时候经常要把DataTable转换成IList;操作DataTable比较麻烦,把DataTable转换成IList,以对象实体作为IList的元素,操作起来就非常方便。

注意:实体的属性必须和数据库中的字段必须一一对应,或者数据库字段名.ToLower().Contains(实体属性名.ToLower())

          数据类型暂时至支持int、string、DateTime、float、double

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Reflection; namespace TBToListTest
{
public class TBToList<T> where T : new()
{
/// <summary>
/// 获取列名集合
/// </summary>
private IList<string> GetColumnNames(DataColumnCollection dcc)
{
IList<string> list = new List<string>();
foreach (DataColumn dc in dcc)
{
list.Add(dc.ColumnName);
}
return list;
} /// <summary>
///属性名称和类型名的键值对集合
/// </summary>
private Hashtable GetColumnType(DataColumnCollection dcc)
{
if (dcc == null || dcc.Count == 0)
{
return null;
}
IList<string> colNameList = GetColumnNames(dcc); Type t = typeof(T);
PropertyInfo[] properties = t.GetProperties();
Hashtable hashtable = new Hashtable();
int i = 0;
foreach (PropertyInfo p in properties)
{
foreach (string col in colNameList)
{
if (col.ToLower().Contains(p.Name.ToLower()))
{
hashtable.Add(col, p.PropertyType.ToString() + i++);
}
}
} return hashtable;
} /// <summary>
/// DataTable转换成IList
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public IList<T> ToList(DataTable dt)
{
if (dt == null || dt.Rows.Count == 0)
{
return null;
} PropertyInfo[] properties = typeof(T).GetProperties();//获取实体类型的属性集合
Hashtable hh = GetColumnType(dt.Columns);//属性名称和类型名的键值对集合
IList<string> colNames = GetColumnNames(hh);//按照属性顺序的列名集合
List<T> list = new List<T>();
T model = default(T);
foreach (DataRow dr in dt.Rows)
{
model = new T();//创建实体
int i = 0;
foreach (PropertyInfo p in properties)
{
if (p.PropertyType == typeof(string))
{
p.SetValue(model, dr[colNames[i++]], null);
}
else if (p.PropertyType == typeof(int))
{
p.SetValue(model, int.Parse(dr[colNames[i++]].ToString()), null);
}
else if (p.PropertyType == typeof(DateTime))
{
p.SetValue(model, DateTime.Parse(dr[colNames[i++]].ToString()), null);
}
else if (p.PropertyType == typeof(float))
{
p.SetValue(model, float.Parse(dr[colNames[i++]].ToString()), null);
}
else if (p.PropertyType == typeof(double))
{
p.SetValue(model, double.Parse(dr[colNames[i++]].ToString()), null);
}
} list.Add(model);
} return list;
} /// <summary>
/// 按照属性顺序的列名集合
/// </summary>
private IList<string> GetColumnNames(Hashtable hh)
{
PropertyInfo[] properties = typeof(T).GetProperties();//获取实体类型的属性集合
IList<string> ilist = new List<string>();
int i = 0;
foreach (PropertyInfo p in properties)
{
ilist.Add(GetKey(p.PropertyType.ToString() + i++, hh));
}
return ilist;
} /// <summary>
/// 根据Value查找Key
/// </summary>
private string GetKey(string val, Hashtable tb)
{
foreach (DictionaryEntry de in tb)
{
if (de.Value.ToString() == val)
{
return de.Key.ToString();
}
}
return null;
} }
} namespace TBToListTest
{ //实体
public class Person
{
public int ID
{
set;
get;
} public string Name
{
set;
get;
} public string Age
{
set;
get;
} public string Lover
{
set;
get;
} }
} using System;
using System.Data; namespace TBToListTest
{
class Program
{
static void Main(string[] args)
{
TBToList<Person> tol = new TBToList<Person>();
Console.WriteLine();
DataTable dt = GetTable();
tol.ToList(dt);
Console.Read();
} public static DataTable GetTable()
{
DataTable dt = new DataTable();
dt.Columns.Add("ID");
dt.Columns.Add("Age");
dt.Columns.Add("Lover");
dt.Columns.Add("Name");
DataRow dr = dt.NewRow();
dr["ID"] = 1;
dr["Age"] = "Age1";
dr["Lover"] = "Lover1";
dr["Name"] = "Name1";
dt.Rows.Add(dr);
DataRow dr1 = dt.NewRow();
dr1["ID"] = 2;
dr1["Age"] = "Age2";
dr1["Lover"] = "Lover2";
dr1["Name"] = "Name2";
dt.Rows.Add(dr1);
return dt;
}
}
}

DataTable转换成IList的更多相关文章

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

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

  2. C# 中 DataTable转换成IList

    在用C#作开发的时候经常要把DataTable转换成IList:操作DataTable比较麻烦,把DataTable转换成IList,以对象实体作为IList的元素,操作起来就非常方便. 注意:实体的 ...

  3. DataTable转换成IList 【转载】

    链接:http://www.cnblogs.com/hlxs/archive/2011/05/09/2087976.html#2738813 留着学习 using System; using Syst ...

  4. C# DataTable转换成实体列表 与 实体列表转换成DataTable

    /// <summary> /// DataTable转换成实体列表 /// </summary> /// <typeparam name="T"&g ...

  5. DataTable转换成匿名类的List类型

    DataTable转换成匿名类的List类型   因为匿名类是不能够 Activator.CreateInstance进行反射实例化的 /// <summary> /// 匿名类的转换方式 ...

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

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

  7. asp.net dataTable转换成Json格式

    /// <summary> /// dataTable转换成Json格式 /// </summary> /// <param name="dt"> ...

  8. 将DataTable转换成CSV文件

    DataTable用于在.net项目中,用于缓存数据,DataTable表示内存中数据的一个表.CSV文件最早用在简单的数据库里,由于其格式简单,并具备很强的开放性,所以起初被扫图家用作自己图集的标记 ...

  9. 将DataSet(DataTable)转换成JSON格式(生成JS文件存储)

    public static string CreateJsonParameters(DataTable dt) { /**/ /**/ /**/ /* /*********************** ...

随机推荐

  1. Mac终端使用mysql

    1.安装完mysql后给mysql命别名 alias mysql=/usr/local/mysql/bin/mysql aliasmysqladmin=/usr/local/mysql/bin/mys ...

  2. 提高ASP.NET网站性能的方法

    http://www.360doc.com/content/14/0705/18/7662927_392224856.shtml   Asp.NET有许多秘密,当你了解了这些秘密后,可以使得你的ASP ...

  3. 第六篇:二维数组的传输 (host <-> device)

    前言 本文的目的很明确:介绍如何将二维数组传递进显存,以及如何将二维数组从显存传递回主机端. 实现步骤 1. 在显存中为二维数组开辟空间 2. 获取该二维数组在显存中的 pitch 值 (cudaMa ...

  4. PHP后台代码解决跨域问题

      在前端里面,解决跨域的时候总显得那么的恶心,什么jsonp啊,ajax啊,CORS啊什么的,总觉得是在钻空子进行跨域,其实在PHP文件里面只需要加一段代码就可以跨域了,前端你该怎么写还是怎么写,p ...

  5. Codeforces Round #359 (Div. 2) C. Robbers' watch 搜索

    题目链接:http://codeforces.com/contest/686/problem/C题目大意:给你两个十进制的数n和m,选一个范围在[0,n)的整数a,选一个范围在[0,m)的整数b,要求 ...

  6. HDU1536 S-Nim

    S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  7. mysql数据的导入与导出

    参考:http://blog.sina.com.cn/s/blog_81b2b2a1010188q0.html  http://blog.csdn.net/xin_yu_xin/article/det ...

  8. 离线微博工具Open Live Writer(Windows Live Writer)安装过程及server error 500错误解决

    必备条件: .net framework 3.5框架(大概是要求3.5或以上,不确定,好像没有人遇到和这个相关的问题) 2017年7月27日最新官方版0.6.2英文离线客户端网盘下载(官网的安装包无法 ...

  9. 模拟Push和Pop动作

    //利用CATransition来作模拟 //模拟Push - (void)pushView:(UIView *)pushView inView:(UIView *)inView { CATransi ...

  10. 品友互动大数据平台的技术演化 https://www.sohu.com/a/191202836_99982360

    品友互动大数据平台的技术演化