DataTable转换成IList

//文章出处:

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;        }    }}
时间: 2024-10-12 04:44:18

DataTable转换成IList的相关文章

DataTable转换成IList&lt;T&gt;的简单实现

DataTable的无奈 很多时候,我们需要去操作DataTable.但DataTable的操作,实在是太不方便了.Linq?lambda表达式?统统没有... 特别是对现有结果集做进一步筛选,这样的高频率动作,DataTable却无能为力. 网上很多朋友说用反射实现.那么问题来了,一定要用反射吗? 下面我们用一个不用反射的方式实现: TableToList类 using System; using System.Collections.Generic; using System.Linq; u

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

/// <summary> /// DataTable转换成实体列表 /// </summary> /// <typeparam name="T">实体 T </typeparam> /// <param name="table">datatable</param> /// <returns></returns> public static IList<T>

C#将DataTable转换成list的方法

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

将DataTable转换成CSV文件

DataTable用于在.net项目中,用于缓存数据,DataTable表示内存中数据的一个表.CSV文件最早用在简单的数据库里,由于其格式简单,并具备很强的开放性,所以起初被扫图家用作自己图集的标记.CSV文件是个纯文本文件,每一行表示一张图片的许多属性. 在.net项目中运用C#将DataTable转化为CSV文件,现在提供一个较为通用的方法,具体代码如下:         /// <summary>         /// 将DataTable转换成CSV文件         /// &

DataTable转换成List&lt;T&gt;

很多时候需要将DataTable转换成一组model,直接对model执行操作会更加方便直观. 代码如下: 1 public static class DataTableToModel 2 { 3 public static List<T> ConvertToModel<T>(this DataTable dt) 4 { 5 if (dt == null || dt.Rows.Count == 0) 6 { 7 return null; 8 } 9 10 var result =

将list&lt;对象&gt;转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其他的方法,不过这个方法已经实现,就写一下了: 1.创建表. CREATE TABLE [dbo].[person]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NULL, [Pwd] [nvarchar](50) NULL, [Age]

将DataTable转换成list

将DataTable转换成list 及数据分页. <1> /// <summary> /// 酒店评论列表-分页 /// </summary> /// <param name="userId"></param> /// <param name="pageIndex">当前页</param> /// <returns></returns> public stat

C# DataTable转换成DataRow

linq中的cast<T>()及OfType<T>() DataTable dt=...........//获取从数据库中取出的数据(假设只有一条记录) //Cast<T>()用来将非泛型的序列转换为泛型的序列 DataRow row=dt.Rows.Cast<DataRow>().Single(); //OfType<T>():用来将序列中可以转换的转换为指定的序列 如:一个object数组中有整数和字符串,现在想找出其中最大的数 object

如何将DataTable转换成List&lt;T&gt;呢?

昨日在工作中,遇到一个问题:需要将查询出来的DataTable数据源,转换成List<T>的泛型集合(已知T类型).第一反应,我想肯定要用到“泛型”(这不是废话吗?都说了要转换成List<T>泛型集合了),而且还要用到“反射”相关的.呵呵.很快,我就做出了一个小实例,测试通过.下面我将代码贴出来,分享给大家.代码都有详细的注释,读者朋友可以很清晰的看懂我的思路. 这是我写的一个通用转换类,完成此类操作 using System; using System.Collections.G