C#关于DataTable全表查询的优化

初级程序员的历程
由于公司的项目比较多,在研发人员不够的情况下,我由java开发暂时接手一个.net的winform开发,在完全没接触过.net的情况下,开始了自己的踩坑之旅。
在开发过程中印象最深的一个点是,有一个数据量为2万行的DataTable要进行数据处理,有一个字段(假设是a字段)是有许多内容相同的,对同一内容的a字段进行某些操作,所以需要在DataTable中查询a字段为某值的所有数据,在百度了DataTable的查询方法后,选择了大多人推荐的dt.select(express)来获取满足条件的所有行,之后会对这些行进行一系列的逻辑处理,也就是在select之后还有两部分的循环。
这是生成报表过程中的一部分数据处理,为了防止winform界面卡死,所以开启了线程。问题就出现在这里,在之前数据量为7000左右的情况下,跑出报表需要一分钟左右,当数据量到了2万行,跑出报表需要七分钟以上,虽然在到两万行之前在代码中加了一些逻辑判断,但我想应该对速度没什么影响吧,但是这个现象让我觉得很无法理解,所以我也以为是没有开线程(此时在我的心里认为开启线程就等于程序运行速度加快),但是查看代码后发现是开了线程的,所以耗时的地方在代码中。
之后查看文档,查到了datatable的select方法类似于全表查询获取,每次查询都要差不多遍历全表,如果第一个查询的内容在表的最后一行,那第一次就要遍历全表,所以这个时间复杂度是很大的,所以程序运行的慢的原因就是在这里,同时,类似于多个嵌套for循环的程序,也会耗时较多,最终的解决办法是将datatable转化为了dictionary<string,List>的形式,在查数据的时候使用dictionary.TryGetValue(key,out list)获取所有符合条件的数据,也就是for循环的时间复杂度降为了n,再次跑报表的时候,果然,速度相比之前可以用飞速来形容了。
作为刚毕业的新人,在程序开发道路上还有很多要理解要探索的事情,从这个问题中可以看出,我对线程的理解太浅,对程序优化也是刚刚才摸到,以后加油,也记录成长路上遇到的各种问题,努力提升自己。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值