您的位置:首页 > 编程语言 > C#

C#基础 之 DataTable操作性能优化

2014-08-22 16:18 1486 查看

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
 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DataTable