本文轉載自http://blog.csdn.net/chentaihan/article/details/6407284數據庫
做者:陳太漢ide
在用C#做開發的時候常常要把DataTable轉換成IList;操做DataTable比較麻煩,把DataTable轉換成IList,以對象實體做爲IList的元素,操做起來就很是方便。編碼
注意:實體的屬性必須和數據庫中的字段必須一一對應,或者數據庫字段名.ToLower().Contains(實體屬性名.ToLower())spa
數據類型暫時只支持int、string、DateTime、float、double.net
- 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初版出來以後,昨晚老是以爲有不少地方能夠改進,因此今天一大早來就把它給修訂了,固然還有一些地方能夠改進,等我之後編碼能力提升以後再出第三版吧,第二版應該夠用orm
對象
- using System;
- using System.Collections.Generic;
- using System.Reflection;
- using System.Collections;
- using System.Data;
- namespace JSONTest
- {
- public class TableToList<T> where T : new()
- {
- /// <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();//獲取實體類型的屬性集合
- IList<string> colNames = GetColumnNames(dt.Columns);//按照屬性順序的列名集合
- 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(bool))
- {
- p.SetValue(model, bool.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(DataColumnCollection dcc)
- {
- PropertyInfo[] properties = typeof(T).GetProperties();//獲取實體類型的屬性集合
- //因爲集合中的元素是肯定的,因此能夠指定元素的個數,系統就不會分配多餘的空間,效率會高點
- IList<string> ilist = new List<string>(dcc.Count);
- foreach (PropertyInfo p in properties)
- {
- foreach (DataColumn dc in dcc)
- {
- if (dc.ColumnName.ToLower().Contains(p.Name.ToLower()))
- {
- ilist.Add(dc.ColumnName);
- }
- }
- }
- return ilist;
- }
- }
- }