Foxtable(狐表)用户栏目专家坐堂 → 下列代码能优化吗?


  共有14891人关注过本帖树形打印复制链接

主题:下列代码能优化吗?

帅哥哟,离线,有人找我吗?
xl
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:400 积分:3961 威望:0 精华:0 注册:2009/4/28 7:39:00
下列代码能优化吗?  发帖心情 Post By: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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33963 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2009/12/19 21:50:00 [只看该作者]


前面的if可以看看帮助中的Select Case语句
后面的代码好怪,给文件看看。


 回到顶部
帅哥哟,离线,有人找我吗?
xl
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:400 积分:3961 威望:0 精华:0 注册:2009/4/28 7:39:00
  发帖心情 Post By:2009/12/19 23:17:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:900000.rar


 回到顶部
帅哥哟,离线,有人找我吗?
czy
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33963 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:400 积分:3961 威望:0 精华:0 注册:2009/4/28 7:39:00
  发帖心情 Post By:2009/12/20 0:05:00 [只看该作者]

又学新知了,谢谢C老师!    夜深了,C老师辛苦了,休息了.

 回到顶部
帅哥哟,离线,有人找我吗?
czy
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33963 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By: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
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:400 积分:3961 威望:0 精华:0 注册:2009/4/28 7:39:00
  发帖心情 Post By: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
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:400 积分:3961 威望:0 精华:0 注册:2009/4/28 7:39:00
  发帖心情 Post By: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
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:400 积分:3961 威望:0 精华:0 注册:2009/4/28 7:39:00
  发帖心情 Post By: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
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:400 积分:3961 威望:0 精华:0 注册:2009/4/28 7:39:00
  发帖心情 Post By: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

 


 回到顶部
总数 12 1 2 下一页