先来说一下背景,机房重构用了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;
}