将DataTable转换为List的好处与实现方法

现在的DataTable慢慢退出历史舞台,主要是有以下几个原因:


1.List<t>是强类型化的,而DataTable不是一般的DataTable,
访问某列时,是通过string的ColumnName来取得的,
比如:string name = dt.Rows[i][&quot;Name&quot;].ToString();
因为是string的列名,存在记错写错的风险,且编译不检查而List<t>,
因为类型化的元素,编程时属性可以有IDE的智能感知来选择,编码更方便。
不容易出错:string name = list[0].Name;


2.Linq的强有力支持,使得操作List<t>有前所未有的快感其实在linq出来之前,
还是DataTable用的多,因为要想过滤数据,可以用DataView,DataTable.Select()等方法。
而List<t>只能是自己写循环,麻烦。Linq出来之后,where,join,group by,order by...等等操作,
对于List<t>的查询真是很便利。


3.DataTable的结构远比List<t>要复杂,内存占用量更大。在有变化的场合下,
DataTable里要维护不同RowState的数据(修改前的和现在的),还有Schema数据List<t>就没有这些累赘,更轻快。所以,Linq+List<t>才使得现在大家越来越倾向使用List<t>而不是DataTable

                                                                              -------------以上评价来自网络

  1. /// DataTable 转换为List 集合  
  2. /// </summary>  
  3. /// <typeparam name="TResult">类型</typeparam>  
  4. /// <param name="dt">DataTable</param>  
  5. /// <returns></returns>  
  6. //<类型参数必须是类并且具有无参数的公共构造函数。当与其他约束一起使用时,new()约束必须最后指定。<  
  7. public static List<TResult> ToList<TResult>(this DataTable dt) where TResult : class,new()  
  8. {  
  9.   
  10.     //创建一个属性的列表  
  11.     List<PropertyInfo> prlist = new List<PropertyInfo>();  
  12.     //获取TResult的类型实例  反射的入口  
  13.     Type t = typeof(TResult);  
  14.     //获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表  
  15.     Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); });  
  16.     //创建返回的集合  
  17.     List<TResult> oblist = new List<TResult>();  
  18.     foreach (DataRow row in dt.Rows)  
  19.     {  
  20.         //创建TResult的实例  
  21.         TResult ob = new TResult();  
  22.         //找到对应的数据,并赋值  
  23.         prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); });  
  24.         //放入到返回的集合中.  
  25.         oblist.Add(ob);  
  26.     }  
  27.     return oblist;  
  28. }  


 

 当然,你也可以将List转换为DataTable:

    

    1. /// 将泛类型集合List类转换成DataTable   
    2.     /// </summary>   
    3.     /// <param name="list">泛类型集合</param>   
    4.     /// <returns></returns>   
    5.     public static DataTable ToDataTable<T>(List<T> entitys)  
    6.     {  
    7.   
    8.         //检查实体集合不能为空   
    9.         if (entitys == null || entitys.Count < 1)  
    10.         {  
    11.             throw new Exception("需转换的集合为空");  
    12.         }  
    13.   
    14.         //取出第一个实体的所有Propertie   
    15.         Type entityType = entitys[0].GetType();  
    16.         PropertyInfo[] entityProperties = entityType.GetProperties();  
    17.   
    18.         //生成DataTable的structure   
    19.         //生产代码中,应将生成的DataTable结构Cache起来,此处略   
    20.         DataTable dt = new DataTable();  
    21.         for (int i = 0; i < entityProperties.Length; i++)  
    22.         {  
    23.             //dt.Columns.Add(entityProperties[i].Name, entityProperties[i].PropertyType);  
    24.             dt.Columns.Add(entityProperties[i].Name);  
    25.         }  
    26.   
    27.         //将所有entity添加到DataTable中   
    28.         foreach (object entity in entitys)  
    29.         {  
    30.             //检查所有的的实体都为同一类型   
    31.             if (entity.GetType() != entityType)  
    32.             {  
    33.                 throw new Exception("要转换的集合元素类型不一致");  
    34.             }  
    35.             object[] entityValues = new object[entityProperties.Length];  
    36.             for (int i = 0; i < entityProperties.Length; i++)  
    37.             {  
    38.                 entityValues[i] = entityProperties[i].GetValue(entity, null);  
    39.   
    40.             }  
    41.             dt.Rows.Add(entityValues);  
    42.         }  
    43.         return dt;  
    44.     }   
posted @ 2013-04-11 11:16  C#老头子  Views(561)  Comments(0)    收藏  举报