以文本方式查看主题
- Foxtable(狐表) (http://foxtable.net/bbs/index.asp)
-- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2)
---- 帮我提速啊~ 从 90几 秒提高到了 2 秒左右 就看代码强不强了。。。 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=8511)
|
-- 作者:mr725
-- 发布时间:2010/11/5 21:50:00
-- 帮我提速啊~ 从 90几 秒提高到了 2 秒左右 就看代码强不强了。。。
在test表中,第一列是序号(不参与代码运行,只是摆设,呵呵),第二列是有重复号码的列,第三列中对应第二列相同号吗的只有一行有内容···
要求达到:补齐第三列的内容,即,第二列相同号码的,补齐第三的内容:
命令窗口用下面代码试一试: 我这里要90秒啊···
Dim s2 As Date = Date.Now() Dim s As String s = DataTables("test").GetComboListString("第二列","[第三列] is not null")
Dim n As Integer = 0 For i As Integer = 0 To Tables("test").count -1 If Tables("test")(i,"第三列") = Nothing Continue For Else Dim drs As List(Of DataRow) drs = DataTables("test").Select("[第二列] = \'" & Tables("test")(i,"第二列") & "\' ") For Each dr As DataRow In drs If dr("第三列") = Nothing dr("第三列") = Tables("test")(i,"第三列") End If Next End If Next Messagebox.Show("处理完毕! 耗时: " & (Date.Now -s2).TotalSeconds) \'【90.5s 太慢】
[此贴子已经被作者于2010-11-6 1:47:18编辑过]
|
-- 作者:mr725
-- 发布时间:2010/11/5 21:56:00
--
就是这样的结果:
此主题相关图片如下:test.jpg
|
-- 作者:czy
-- 发布时间:2010/11/5 23:29:00
--
正常的方式好象提不了速。
比如:
Dim s2 As Date = Date.Now() Dim Les As List(Of String) = DataTables("test").GetUniqueValues("[第三列] is not null","第二列") For Each Le As String In Les Dim drs As List(Of DataRow) = DataTables("test").Select("[第二列] = " & Le) For n As Integer = 0 To drs.Count - 1 If n > 0 Then drs(n)("第三列") = drs(n-1)("第三列") End If Next Next Output.Show("处理完毕! 耗时: " & (Date.Now -s2).TotalSeconds)
速度低的可怜。
|
-- 作者:czy
-- 发布时间:2010/11/5 23:31:00
--
变态的方式。
Dim s2 As Date = Date.Now() Dim dtb As New DataTableBuilder("Temp") dtb.AddDef("第二列", Gettype(Double)) dtb.AddDef("第三列", Gettype(String),32) dtb.TableVisible = False dtb.Build() Dim Les As List(Of String()) = DataTables("test").GetUniqueValues("[第三列] is not null","第二列","第三列") For Each Le As String() In Les Dim r As Row = Tables("Temp").AddNew r("第二列") = Le(0) r("第三列") = Le(1) Next Relations.Add("关联",DataTables("Temp").DataCols("第二列"),DataTables("test").DataCols("第二列"),False) DataTables("test").DataCols.Add("X", Gettype(String), "Parent(关联).第三列") For Each dr As DataRow In DataTables("test").DataRows dr("第三列") = dr("X") Next Relations.Delete("关联") DataTables("test").DataCols.Delete("X") Output.Show("处理完毕! 耗时: " & (Date.Now -s2).TotalSeconds) \'【0.9s 还行】
|
-- 作者:czy
-- 发布时间:2010/11/5 23:52:00
--
我没办法了
用PDATE直接后台计算居然比一楼代码还慢
|
-- 作者:mr725
-- 发布时间:2010/11/6 0:08:00
--
【0.9s 还行】 什么机子啊,我这还要10秒呢···
总之,比1楼的快多了~ 哈哈,谢谢C版。。。。。。。
|
-- 作者:czy
-- 发布时间:2010/11/6 0:13:00
--
这个更快
Dim s2 As Date = Date.Now() Dim dtb As New DataTableBuilder("Temp") dtb.TableVisible = False dtb.Build() DataTables("Temp").Fill("Select * From {test}", True) For Each dr As DataRow In DataTables("test").DataRows Dim dr1 As DataRow = DataTables("Temp").Find("第二列 = \'" & dr("第二列") & "\' And 第二列 Is Not Null") If dr1 IsNot Nothing dr("第三列") = dr1("第三列") End If Next Output.Show("处理完毕! 耗时: " & (Date.Now -s2).TotalSeconds)
|
-- 作者:mr725
-- 发布时间:2010/11/6 0:25:00
--
是的又提高近一倍的速度了~~ 谢谢。
不过有问题: 如果第三列的内容不在同号吗的第一行,就会被清空了~~~
[此贴子已经被作者于2010-11-6 0:28:29编辑过]
|
-- 作者:mr725
-- 发布时间:2010/11/6 0:30:00
--
此主题相关图片如下:test1.jpg
|
-- 作者:czy
-- 发布时间:2010/11/6 0:34:00
--
改成这样试试:
Dim s2 As Date = Date.Now() Dim dtb As New DataTableBuilder("Temp") dtb.TableVisible = False dtb.Build() DataTables("Temp").Fill("Select * From {test} Where 第三列 Is Not Null",True) For Each dr As DataRow In DataTables("test").DataRows Dim dr1 As DataRow = DataTables("Temp").Find("第二列 = \'" & dr("第二列") & "\'") If dr1 IsNot Nothing Then dr("第三列") = dr1("第三列") End If Next Output.Show("处理完毕! 耗时: " & (Date.Now -s2).TotalSeconds)
|