Foxtable(狐表)用户栏目专家坐堂 → 请教实现方案


  共有5734人关注过本帖平板打印复制链接

主题:请教实现方案

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


加好友 发短信
等级:三尾狐 帖子:688 积分:4903 威望:0 精华:0 注册:2013/10/27 17:14:00
  发帖心情 Post By:2014/5/13 23:17:00 [只看该作者]

代码优化问题:

 

Dim Arys As List(Of String())
Arys = DataTables("试验临时数据").GetValues("来源|有效序") '列名用符号|分割
'注意循环变量是字符型数组,所以类型是String(),而不是String
For Each Ary As String() In Arys
    'Output.Show(Ary(0) & "|" & Ary(1))
    Dim cnt As Integer
    Dim ly As String
    Dim yx As Integer
    ly = Ary(0)
    yx = Ary(1)
    cnt = DataTables("试验临时数据").Compute("Count([编号])", "[来源] = '" & ly & "' And [有效序] = '" & yx & "'  And 结果 = '合格'")
    'Output.Show(Ary(0) & "|" & Ary(1) & "|" & cnt)
    Dim drs As List(Of DataRow)
    drs = DataTables("试验临时数据").Select("[来源] = '" & ly & "' And [有效序] = '" & yx & "'")
    For Each dr As DataRow In drs
        dr("合格数量") = cnt
    Next
Next

 

本段代码相当耗费时间 执行需要27秒(处理4000多条数据)

 

经查帮助:

是因为以下原因。

现在我总结一下,符合以下三个条件,会出现效率低下的情况:

1、用For语句遍历某个表。
2、遍历过程中会用Find或Select查询此表,或者用Compute方法统计此表。
3、遍历过程中会大量修改此表中某些行的值,被修改的行数越多,对于性能影响越大,如果被修改的行数很少,则几乎没有影响。

 

那么代码 该如何改造成类似的:

 

 

Dim Dic As new Dictionary(of DataRow, Integer)
Dim
v As Double
For Each
dr As DataRow In DataTables("表A").DataRows
v = DataTables("表A").Compute("Count(第二列 )", "第二列 = " & dr("第一列"))
dic
.Add(dr, v
)
Next
For Each
dr As DataRow In dic.Keys
dr("第四列") = dic(dr)
Next

 

 

另一个问题 既然编写帮助时以发现了这样的问题,为什么 后面的帮助 给出的代码示例,全部是没有规避该原则的代码示例呢?

既然已经发现问题,再给出代码示例时,最好符合该原则,代码使得上述2、3项不再出现在同一个遍历语句中,而是在不同的遍历语句中出现。


 回到顶部
总数 44 1 2 3 4 5 下一页