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

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方法上

新建一张含有这三个字段的DataTableC,然后复制Security字段,然后遍历另外两张表,对其采用Select方法查找对应的SecurityCode,然后复制给C中对应字段。

 

解决方案二:

替换了Select方法,创建了一个类型为Dictionary<String,DataRow>的包含目标合并后DataTable对象的所有行的结构C,其中关键字为SecurityCodeDataRow为包含SecurityCodeHighLow三列数据的行。在合并的时候,直接遍历表A的所有行,然后判断在C中是否包含该行中的SecurityCode,如果包含,取出,直接赋值。然后遍历表B。整个过程使得DataTable合并的效率至少提高了10

 

性能分析

DataTable提供了两个查询数据的接口,DataTable.SelectDataTable.Rows.Find方法。

DataTableSelect方法通过传入一系列条件,然后返回一个DataRow[ ]类型的数据,他需要遍历整个表,然后挨个匹配条件,然后返回所有匹配的值。

DataTable.RowsFind查找第一个匹配上的唯一一条记录,仅对主键字段进行检索。在指定了主键的基础上,查找会采用二叉树的方式查找,效率高。要创建主键,需要指定DataTablePrimaryKey字段如下:dtA.PrimaryKey = new DataColumn[] { dtA.Columns["SecurityCode"] };

 

在数据填充完成之后,设置主键要比在填充数据之前设置主键效率要高的多。

 

如果仅需要查找某一条记录,使用DataTable.Rows.Find会比DataTable.Select快很多。

 

创建DataTable然后创建主键与直接创建和该DataTable相同的Dictionary结构相比,创建Dictionary所需要的时间要少的多,而且几乎不随着记录条数规模的变大而变大。

 

DataTable.Select 方法在仅对主键进行检索时,设置主键之后比没有主键速度快很多。

 

LINQDataTable的查询效率比DataTale.Select方法要高,但是仍然比DataTable.Rows.Find方法效率要低。

 

在某些需要频繁操作DataTable查询的时候,要避免在循环体内调用DataTable.Select方法,采用将DataTable转换为等价的Dictionary结构,能够有效解决由于键值重复导致不能创建主键的问题,并且Dicitonary的采用哈希表的方式查找能够极大地提高查询效率。

 



refer:http://wenku.baidu.com/view/fee93ada58f5f61fb7366624.html

 

 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值