以文本方式查看主题
- Foxtable(狐表) (http://foxtable.com/bbs/index.asp)
-- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2)
---- 下列代码能优化吗? (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=5563)
|
-- 作者:xl
-- 发布时间:2009/12/19 21:41:00
-- 下列代码能优化吗?
弄了个数据统计程序,请老师们看一下能否优化?谢谢! Dim s As Date = Date.Now() Dim t As New DataTableBuilder("temp") \'创建临时表 t.AddDef("字符", GetType(String), 32) t.TableVisible = false t.Build() DataTables("统计").DataRows.Clear() for Each dc as Datacol in DataTables("自由统计数据二").Datacols if dc.name <> "数据1" Then if dc.name <> "数据2" Then if dc.name <> "数据3" Then if dc.name <> "数据4" Then if dc.name <> "数据5" Then if dc.name <> "数据6" Then if dc.name <> "数据7" Then if dc.name <> "数据8" Then if dc.name <> "数据9" Then if dc.name <> "数据10" Then dim f As New Filler f.SourceTable = DataTables("自由统计数据二") \'指定数据来源 f.SourceCols = dc.name \'指定数据来源列 f.DataTable = DataTables("temp") \'指定数据接收表 f.DataCols = "字符" \'指定数据接收列 f.Distinct = false f.Fill() \'填充数据 end if end if end if end if end if end if end if end if end if end if Next DataTables("temp").DeleteFor("[字符] Is Null") \'删除临时表空行 dim f1 As New Filler f1.SourceTable = DataTables("temp") \'指定数据来源 f1.DataTable = DataTables("统计") \'指定数据接收表 f1.ExcludeNullValue = true f1.Fill() \'填充数据 For Each dr As DataRow In DataTables("统计").DataRows dr("出现次数") = DataTables("自由统计数据二").Compute("sum(数据1)", "姓名1 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据2)", "姓名2 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据3)", "姓名3 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据4)", "姓名4 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据5)", "姓名5 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据6)", "姓名6 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据7)", "姓名7 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据8)", "姓名8 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据9)", "姓名9 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据10)", "姓名10 = \'" & dr("字符") & "\'") Next
Messagebox.Show("处理完毕! 耗时: " & (Date.Now -s).TotalSeconds)
|
-- 作者:czy
-- 发布时间:2009/12/19 21:50:00
--
前面的if可以看看帮助中的Select Case语句。 后面的代码好怪,给文件看看。
|
-- 作者:xl
-- 发布时间:2009/12/19 23:17:00
--
|
-- 作者:czy
-- 发布时间:2009/12/19 23:50:00
--
Dim s As Date = Date.Now() Dim t As New DataTableBuilder("temp") \'创建临时表 t.AddDef("字符", GetType(String), 32) t.TableVisible = false t.Build() DataTables("统计").DataRows.Clear() For i As integer = 1 to 10 dim f As New Filler f.SourceTable = DataTables("自由统计数据二") \'指定数据来源 f.SourceCols = "姓名" & i \'指定数据来源列 f.DataTable = DataTables("temp") \'指定数据接收表 f.DataCols = "字符" \'指定数据接收列 f.Distinct = false f.Fill() \'填充数据 Next dim f1 As New Filler f1.SourceTable = DataTables("temp") \'指定数据来源 f1.DataTable = DataTables("统计") \'指定数据接收表 f1.ExcludeNullValue = true f1.Fill() \'填充数据 For Each dr As DataRow In DataTables("统计").DataRows Dim sum As Integer = 0 For i As integer = 1 to 10 sum = sum + DataTables("自由统计数据二").Compute("sum(数据" & i & ")", "姓名" & i & " = \'" & dr("字符") & "\'") dr("出现次数") = sum Next Next Messagebox.Show("处理完毕! 耗时: " & (Date.Now -s).TotalSeconds)
[此贴子已经被作者于2009-12-19 23:52:46编辑过]
|
-- 作者:xl
-- 发布时间:2009/12/20 0:05:00
--
又学新知了,谢谢C老师! 夜深了,C老师辛苦了,休息了.
|
-- 作者:czy
-- 发布时间:2009/12/20 0:27:00
--
这个代码比上一段好一点。
Dim s As Date = Date.Now() Dim t As New DataTableBuilder("temp") \'创建临时表 t.AddDef("字符", GetType(String), 32) t.AddDef("出现次数", GetType(Integer), 32) t.TableVisible = false t.Build() DataTables("统计").DataRows.Clear() For i As integer = 1 to 10 dim f As New Filler f.SourceTable = DataTables("自由统计数据二") \'指定数据来源 f.SourceCols = "姓名" & i & "," & "数据" & i \'指定数据来源列 f.DataTable = DataTables("temp") \'指定数据接收表 f.DataCols = "字符,出现次数" \'指定数据接收列 f.Distinct = false f.Filter = "姓名" & i & " Is Not Null" f.Fill() \'填充数据 Next dim f1 As New Filler f1.SourceTable = DataTables("temp") \'指定数据来源 f1.DataTable = DataTables("统计") \'指定数据接收表 f1.Fill() \'填充数据 For Each dr As DataRow In DataTables("统计").DataRows dr("出现次数") = DataTables("temp").Compute("sum(出现次数)", "[字符] = \'" & dr("字符") & "\'") Next Messagebox.Show("处理完毕! 耗时: " & (Date.Now -s).TotalSeconds)
[此贴子已经被作者于2009-12-20 0:28:24编辑过]
|
-- 作者:xl
-- 发布时间:2009/12/20 9:50:00
--
以下是引用czy在2009-12-20 0:27:00的发言:这个代码比上一段好一点。 Dim s As Date = Date.Now() ....................................... dr("出现次数") = DataTables("temp").Compute("sum(出现次数)", "[字符] = \'" & dr("字符") & "\'") Next Messagebox.Show("处理完毕! 耗时: " & (Date.Now -s).TotalSeconds)
[此贴子已经被作者于2009-12-20 0:28:24编辑过]
又是凌晨.........,代码越来越精悍,深入比较学习中.......
|
-- 作者:xl
-- 发布时间:2009/12/20 10:42:00
--
学习4楼文件体会:
一、填充问题
这种填充方式(适合于排除少量列、列名无规律使用):
for Each dc as Datacol in DataTables("自由统计数据二").Datacols if dc.name <> "数据1" Then if dc.name <> "数据2" Then if dc.name <> "数据3" Then ........... end if end if end if end if Next
与以下代码等效:
For i As integer = 1 to 10 dim f As New Filler f.SourceTable = DataTables("自由统计数据二") \'指定数据来源 f.SourceCols = "姓名" & i \'指定数据来源列 f.DataTable = DataTables("temp") \'指定数据接收表 f.DataCols = "字符" \'指定数据接收列 f.Distinct = false f.Fill() \'填充数据 Next
或与以下代码等效:
dim f As New Filler f.SourceTable = DataTables("自由统计数据二") \'指定数据来源 f.SourceCols = "姓名1,姓名2,姓名3,姓名4,姓名5,姓名6,姓名7,姓名8,姓名9,姓名10" f.DataTable = DataTables("temp") \'指定数据接收表 f.DataCols = "字符" \'指定数据接收列 f.Distinct = false f.Fill() \'填充数据 三种方案第2种最佳.
|
-- 作者:xl
-- 发布时间:2009/12/20 10:43:00
--
(续):
二、流程控制语句的转换
原句:
For Each dr As DataRow In DataTables("统计").DataRows dr("出现次数") = DataTables("自由统计数据二").Compute("sum(数据1)", "姓名1 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据2)", "姓名2 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据3)", "姓名3 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据4)", "姓名4 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据5)", "姓名5 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据6)", "姓名6 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据7)", "姓名7 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据8)", "姓名8 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据9)", "姓名9 = \'" & dr("字符") & "\'")+DataTables("自由统计数据二").Compute("sum(数据10)", "姓名10 = \'" & dr("字符") & "\'") Next
精简句:
Dim sum As Integer = 0 For i As integer = 1 to 10 sum = sum + DataTables("自由统计数据二").Compute("sum(数据" & i & ")", "姓名" & i & " = \'" & dr("字符") & "\'") dr("出现次数") = sum Next
第1次见到for….next在实际中运用,sum(数据" & i & ")和姓名" & i &大大精简代码。
注意:for….next与for each语句的转换。
|
-- 作者:xl
-- 发布时间:2009/12/20 11:15:00
--
6楼下列语句难理解,请老师指点一下:
f.SourceCols = "姓名" & i & "," & "数据" & i
我的理解不知对否:
数据1、数据2、数据3。。。。。。通过for…..next语句可表示为:
数据" & i & "
填充来源列常规用法为:f.SourceCols = "姓名1,数据1"
按常规用法应改为:f.SourceCols = "姓名" & i & ",数据" & i & "",而C老师在6楼用法是:f.SourceCols = "姓名" & i & "," & "数据" & i
|