• DataTable转换成IList


    C#的学习点滴

    开发中写过的一些有用的代码。


    作者
    作者:斑鸠
    更新时间:2011/06/21

    作者:陈太汉

    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;
    }
    }
    }
    分类: .NET
  • 相关阅读:
    mysql自增主键
    mysql数据库的备份与恢复
    mysql(mariadb)新建用户及用户授权管理
    vm如何安装xenserver
    安装Centos7时提示 /dev/root does not exits
    python简单实现目录对比
    PM2 实现 自动重启 node 服务 , 例如 服务器重启时,自动启动 之前的服务
    阿里云免费ssl申请配置
    umi-request 配置,出现 某一个接口跨域
    ndm 带空格 做整体
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2217589.html
Copyright © 2020-2023  润新知