zoukankan      html  css  js  c++  java
  • 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;
    }
    }
    }

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

  • 相关阅读:
    700. Search in a Binary Search Tree
    100. Same Tree
    543. Diameter of Binary Tree
    257. Binary Tree Paths
    572. Subtree of Another Tree
    226. Invert Binary Tree
    104. Maximum Depth of Binary Tree
    1、解决sublime打开文档,出现中文乱码问题
    移植seetafaceengine-master、opencv到ARM板
    ubuntu16.04-交叉编译-SeetaFaceEngine-master
  • 原文地址:https://www.cnblogs.com/Echo529/p/6382661.html
Copyright © 2011-2022 走看看