DataTable合并
// 一般方法,性能不好
DataTable[] srcTables = ... ;
foreach( DataTable src in srcTables )
{
dest.Merge( src ) ;
}
// 推荐方法,速度是上面的100倍
DataTable[] srcTables = ... ;
foreach( DataTable src in srcTables )
{
foreach( DataRow row in src.Rows)
{
dest.ImportRow( row ) ;
}
}
DataTable过滤
// 一般方法,性能不好
DataView dv = dt.DefaultView ;
dv.RowFilter = filter ;
DataTable result = dv.ToTable() ;
// 推荐方法,有数十倍的性能提高。
DataRow[] rows = dv.Select( filter ) ;
foreach( DataRow row in rows )
{
result.ImportRow(row) ;
}
场景:
表A,存储股票的最高价信息, 表B存储股票最低价信息
SecurityCode | High | SecurityCode | Low |
000001.SZ | 20 | 000001.SZ | 18.5 |
000002.SZ | 26 | 000002.SZ | 56 |
现在需要,将这两张表拼接到一张表中,这张表有三列字段,SecurityCode High Low
解决方案一:性能不好,问题出现在Select方法上
新建一张含有这三个字段的DataTable表C,然后复制Security字段,然后遍历另外两张表,对其采用Select方法查找对应的SecurityCode,然后复制给C中对应字段。
解决方案二:
替换了Select方法,创建了一个类型为Dictionary<String,DataRow>的包含目标合并后DataTable对象的所有行的结构C,其中关键字为SecurityCode,DataRow为包含SecurityCode,High,Low三列数据的行。在合并的时候,直接遍历表A的所有行,然后判断在C中是否包含该行中的SecurityCode,如果包含,取出,直接赋值。然后遍历表B。整个过程使得DataTable合并的效率至少提高了10倍。
性能分析
DataTable提供了两个查询数据的接口,DataTable.Select和DataTable.Rows.Find方法。
DataTable的Select方法通过传入一系列条件,然后返回一个DataRow[ ]类型的数据,他需要遍历整个表,然后挨个匹配条件,然后返回所有匹配的值。
DataTable.Rows的Find查找第一个匹配上的唯一一条记录,仅对主键字段进行检索。在指定了主键的基础上,查找会采用二叉树的方式查找,效率高。要创建主键,需要指定DataTable的PrimaryKey字段如下:dtA.PrimaryKey = new DataColumn[] { dtA.Columns["SecurityCode"] };
在数据填充完成之后,设置主键要比在填充数据之前设置主键效率要高的多。
如果仅需要查找某一条记录,使用DataTable.Rows.Find会比DataTable.Select快很多。
创建DataTable然后创建主键与直接创建和该DataTable相同的Dictionary结构相比,创建Dictionary所需要的时间要少的多,而且几乎不随着记录条数规模的变大而变大。
DataTable.Select 方法在仅对主键进行检索时,设置主键之后比没有主键速度快很多。
LINQ对DataTable的查询效率比DataTale.Select方法要高,但是仍然比DataTable.Rows.Find方法效率要低。
在某些需要频繁操作DataTable查询的时候,要避免在循环体内调用DataTable.Select方法,采用将DataTable转换为等价的Dictionary结构,能够有效解决由于键值重复导致不能创建主键的问题,并且Dicitonary的采用哈希表的方式查找能够极大地提高查询效率。
refer:http://wenku.baidu.com/view/fee93ada58f5f61fb7366624.html