是否重复加载DataTable?如何根据字段值更新布尔型行数据?
代码优化建议
嘿,我来帮你梳理下这段代码的问题和优化方向,你怀疑的重复加载DataTable确实是影响性能的关键之一,还有几个细节可以调整来让程序快起来:
1. 消除完全多余的DataTable重复加载
你原来的代码里,GetExcelData已经直接返回了一个DataTable,但你又把它转成DataTableReader,再加载到一个新的DataTable里——这完全是绕了个没必要的弯,既浪费内存又消耗时间,尤其是Excel数据量大的时候,这个重复加载的开销会很明显。
直接改成这样就行:
' 直接复用GetExcelData返回的DataTable,省去中间的Reader和新Table创建 Dim table As DataTable = GetExcelData(gblCompName)
2. 高效更新Single列的值
原来的代码逻辑还有两个问题:一是用table.Select返回所有匹配行后,却只更新了第一行(table.Rows(0)),这明显不符合你的需求;二是Select会生成一个新的DataRow数组,额外占用内存,遍历效率也不如直接循环原表的行。
最优方案:用列表达式自动计算
DataTable支持给列设置计算表达式,这样不用写循环,系统会自动帮你给每一行赋值,效率最高:
' 添加Single列时直接指定表达式,自动根据Class列的值设置布尔值 table.Columns.Add("Single", GetType(Boolean), "Class = 'Single'")
这样连后面的Select和循环代码都可以删掉,省心又高效。
如果需要自定义逻辑(比如忽略大小写):直接遍历行
如果你的匹配逻辑更复杂(比如要忽略大小写),那直接遍历原表的行,避免生成额外的数组:
For Each row As DataRow In table.Rows ' 用OrdinalIgnoreCase忽略大小写,更健壮 row("Single") = row("Class").ToString().Equals("Single", StringComparison.OrdinalIgnoreCase) Next
3. 其他提升性能的小技巧
- 暂停DataGridView刷新:在绑定数据源之前,先暂停DataGridView的布局刷新,避免每次修改Table都触发界面更新,绑定完成后再恢复:
DataGridView1.SuspendLayout() ' 这里执行所有Table操作、绑定数据源的代码 DataGridView1.DataSource = table DataGridView1.ResumeLayout() - 关闭DataTable的事件通知:在批量添加列或修改行时,先调用
BeginLoadData(),结束后调用EndLoadData(),这样DataTable不会每次修改都触发事件,提升操作速度:table.BeginLoadData() ' 在这里添加列、修改行数据 table.EndLoadData() - 检查
GetExcelData函数的效率:程序慢也可能是读取Excel的环节拖了后腿,确保函数里用Using语句自动释放数据库连接、适配器等资源,避免资源泄漏;如果用的是OleDb,确保连接字符串设置了合适的参数(比如IMEX=1处理混合数据类型),或者考虑用更高效的Excel读取库。
优化后的完整代码参考
If openFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then gblCompName = openFileDialog1.FileName End If ' 直接获取Excel数据,避免重复加载 Dim table As DataTable = GetExcelData(gblCompName) ' 暂停DataTable事件通知,提升操作效率 table.BeginLoadData() ' 添加新列,Single列用表达式自动计算 table.Columns.Add("Single", GetType(Boolean), "Class = 'Single'") table.Columns.Add("CouplesInFinal", GetType(Int32)) table.Columns.Add("EvtNum", GetType(String)) table.Columns.Add("EvtStruct", GetType(Int32)) table.Columns.Add("EvtCplID", GetType(Int32)) table.Columns.Add("CouplesInClass", GetType(Int32)) table.Columns.Add("Valid", GetType(Boolean), True) table.EndLoadData() ' 暂停DataGridView刷新,提升绑定速度 DataGridView1.SuspendLayout() DataGridView1.DataSource = table DataGridView1.ResumeLayout()
内容的提问来源于stack exchange,提问作者Hugh Self Taught
相关产品推荐
相关产品推荐

