在用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
{
publicclass 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)
{
returnnull;
}
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)
{
returnnull;
} 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);
}
elseif (p.PropertyType ==typeof(int))
{
p.SetValue(model, int.Parse(dr[colNames[i++]].ToString()), null);
}
elseif (p.PropertyType ==typeof(DateTime))
{
p.SetValue(model, DateTime.Parse(dr[colNames[i++]].ToString()), null);
}
elseif (p.PropertyType ==typeof(float))
{
p.SetValue(model, float.Parse(dr[colNames[i++]].ToString()), null);
}
elseif (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>
privatestring GetKey(string val, Hashtable tb)
{
foreach (DictionaryEntry de in tb)
{
if (de.Value.ToString() == val)
{
return de.Key.ToString();
}
}
returnnull;
} }
} namespace TBToListTest
{ //实体
publicclass Person
{
publicint ID
{
set;
get;
} publicstring Name
{
set;
get;
} publicstring Age
{
set;
get;
} publicstring Lover
{
set;
get;
} }
} using System;
using System.Data; namespace TBToListTest
{
class Program
{
staticvoid Main(string[] args)
{
TBToList<Person> tol =new TBToList<Person>();
Console.WriteLine();
DataTable dt = GetTable();
tol.ToList(dt);
Console.Read();
} publicstatic 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;
}
}
}

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

  1. DataTable转换成IList

    //文章出处: http://www.cnblogs.com/hlxs/archive/2011/05/09/2087976.html DataTable转换成IList 在用C#作开发的时候经常要把 ...

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

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

  3. DataTable转换成IList 【转载】

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

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

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

  5. 将DataTable转换成CSV文件

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

  6. C#将DataTable转换成list的方法

    本文实例讲述了C#将DataTable转换成list及数据分页的方法.分享给大家供大家参考.具体如下: /// <summary>   /// 酒店评论列表-分页  /// </su ...

  7. 将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

    领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其 ...

  8. 简单的反射 把datatable 转换成list对象

    /// <summary> /// 把datatable 转换成list对象 /// </summary> /// <typeparam name="T&quo ...

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

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

随机推荐

  1. Unity3d 插值Lerp与Slerp

    Lerp Lerp表示线性插值. Slerp 球形插值在Vector3.Quaternion等类都有使用,一般多在Quaternion的旋转操作时使用.

  2. c#中的as,is和强转

    as和强转之间的区别: as转换类型失败时不会抛出异常:强转类型失败时会抛出异常 引入is先对变量进行检验: if (foo is int) { i = (int)foo; } logger log ...

  3. ATM自动取款机程序感想

    上周四的Java考试,老师并没有我们考暑假给我们布置的样卷的java程序,而是让我们做一个设计ATM的程序,然而这个对于我们来说好难,因为暑假没有学好java,首先基础知识还没有掌握,输入数据一开始都 ...

  4. 2018.12.19 codeforces 1092F. Tree with Maximum Cost(换根dp)

    传送门 sbsbsb树形dpdpdp题. 题意简述:给出一棵边权为1的树,允许选任意一个点vvv为根,求∑i=1ndist(i,v)∗ai\sum_{i=1}^ndist(i,v)*a_i∑i=1n​ ...

  5. 二级缓存EhCache在几种应用技术的配置方法和步骤总结

    一:Spring和Ehcache缓存集成 业务问题:如果仓库不经常变动,大量进出库,总是需要查询仓库列表 (列表重复) ,使用缓存优化 ! 阅读spring规范29章节 第一步: 导入ehcache的 ...

  6. Bagging和Boosting的区别

    转:http://www.cnblogs.com/liuwu265/p/4690486.html Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的 ...

  7. 【Java】Java批量文件打包下载zip

    网上看了很多,本文使用ant.jar中的org.apache.tools.zip,页面用js表单提交 代码供参考: ACTION: /*      * 另存为      */     @Request ...

  8. 2.2.9静态同步synchronized方法与synchronized(class)代码块

    关键字synchronized还可以应用在static静态方法上,这样写那是对当前的*.java文件对应的class类进行持锁, 测试如下 package com.cky.bean; /** * Cr ...

  9. Android学习指南之三十八:Android手势操作编程[转]

    手势操作在我们使用智能设备的过程中奉献了不一样的体验.Android开发中必然会进行手势操作方面的编程.那么它的原理是怎样的呢?我们如何进行手势操作编程呢? 手势操作原理 首先,在Android系统中 ...

  10. web百度地图跨域问题

    //根据经纬度获取地理位置信息function latOrLng(sLat, sLng) { var resUrl = 'http://api.map.baidu.com/geocoder/v2/?a ...