为什么我用list<T>不用DataTable

先来说一下背景,机房重构用了DataTable也用了list泛型,经历了从DataTable到list泛型的转变,所以对这两个了解的还算深刻。所以,这次我就打算说说为什么要用list泛型,用他有什么好处?

一句话

DataTable 内存中的数据表 一个二维表
list泛型数组 这里面存放的是一个一个的被对象化的数据模型

分析

我的理解建立list泛型优点:
1,减少输入,传输时只需要传一个实例T就可以获取它的任何属性。
2,正确地构建的泛型类可以真正减少代码中的安全性问题。
3,使用泛型类还可以提高性能。其中最大的一个改进是.NET框架组件不会在值类型上使用包装(boxing)。尽管泛型类可以使用多个数据类型工作,但是它在后台单独地处理每一种数据类型。这种技术确保了在你的工作量最小的情况下,应用程序提供最佳的性能。
但是他在绑定数据时也会产生很多麻烦,如:在跟新数据时要将list重新实例化后在绑定数据才会刷新到控件上显示,list是可选择性的技术。

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

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

3.DataTable的结构远比List要复杂,内存占用量更大。
在有变化的场合下,DataTable里要维护不同RowState的数据(修改前的和现在的),还有Schema数据
List就没有这些累赘,更轻快。

所以,Linq+List才使得现在大家越来越倾向使用List而不是DataTable

下面是我建的一个list类,定义list方法

        public List<T> convertToList<T>(DataTable dt) where T : new()
        {
            // 定义集合   
            List<T> ts = new List<T>();
            // 获得此模型的类型   
            Type type = typeof(T);
            //定义一个临时变量   
            string tempName = string.Empty;
            //遍历DataTable中所有的数据行    
            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();
                // 获得此模型的公共属性   
                PropertyInfo[] propertys = t.GetType().GetProperties();
                //遍历该对象的所有属性   
                foreach (PropertyInfo pi in propertys)
                {
                    tempName = pi.Name;//将属性名称赋值给临时变量     
                    //检查DataTable是否包含此列(列名==对象的属性名)       
                    if (dt.Columns.Contains(tempName))
                    {
                        // 判断此属性是否有Setter     
                        if (!pi.CanWrite) continue;//该属性不可写,直接跳出     
                        //取值     
                        object value = dr[tempName];
                        //如果非空,则赋给对象的属性     
                        if (value != DBNull.Value)
                            pi.SetValue(t, value, null);
                    }
                }
                //对象添加到泛型集合中   
                ts.Add(t);
            }
            return ts;
        }
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值