Foxtable(狐表)用户栏目专家坐堂 → 老大还能再来个目瞪口呆吗?


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

主题:老大还能再来个目瞪口呆吗?

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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
老大还能再来个目瞪口呆吗?  发帖心情 Post By:2010/12/14 17:17:00 [只看该作者]

 

Dim t1 As Date = Date.Now
Dim dic As New Dictionary(of DataRow, String)
Dim dic1 As New Dictionary(of DataRow, String)
Dim dic2 As New Dictionary(of DataRow, String)
Dim dr0 As DataRow
Dim drs As List(Of DataRow)
For Each dr As DataRow In DataTables("表A").DataRows
    dr0 = DataTables("表A").Find("[第二列] = " & dr("第一列") & " And [第三列] = false" )
    If dr0 isnot Nothing
        dic.Add(dr,dr0("_identify"))     '同下:::::::
        dic1.Add(dr,dr0("第一列"))       '找到的第二列对应的第一列的数字
        dic2.Add(dr,dr0("第二列"))       '找到的第二列等于当前行第一列的数字
        dr0("第三列") = True               '上面这个条件[第三列] = false是为了排除已经找到过的行
    End If
Next
For Each dr As DataRow In dic.Keys
    dr("第八列") = dic(dr)
Next
For Each dr As DataRow In dic1.Keys
    dr("第九列") = dic1(dr)
Next
For Each dr As DataRow In dic2.Keys
    dr("第十列") = dic2(dr)
Next
For Each dr As DataRow In DataTables("表A").DataRows
    If dr.IsNull("第六列")
        dr("第三列") = False
    End If
Next

Output.Show("计算结束, 耗时: " & (Date.Now - t1).TotalSeconds & "秒")  ‘我这计算结束, 耗时:245.2546秒

 

这是测试用的项目:(是原来狐表的例子

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目21.table

 

筛选后的效果图: 


图片点击可在新窗口打开查看此主题相关图片如下:未命名.jpg
图片点击可在新窗口打开查看

[此贴子已经被作者于2010-12-14 17:27:52编辑过]

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


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/14 17:31:00 [只看该作者]

呵呵,有空再看了,先问问你的任务是啥?


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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2010/12/14 18:19:00 [只看该作者]

以下是引用狐狸爸爸在2010-12-14 17:31:00的发言:

呵呵,有空再看了,先问问你的任务是啥?

任务1:  玩代码····图片点击可在新窗口打开查看        用sql语句也可,lxl版主看看啊····  

任务2: 希望您再给咱一个提高速度方法 ····


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


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/14 22:36:00 [只看该作者]

呵呵,我测试下面的代码不到3秒,只是这样的代码似乎没有什么实用的意义吧:

 

Dim t1 As Date = Date.Now
Dim dic As New Dictionary(of DataRow, DataRow)
Dim lst As New List(of Integer)
Dim drs As List(of DataRow)
Dim dr1 As DataRow
For Each dr1 In DataTables("表A").DataRows
    drs = DataTables("表A").Select("[第二列] = " & dr1("第一列") )
    For Each dr2 As DataRow In drs
        If lst.Contains(dr2("_Identify"))= False Then
            lst.add(dr2("_Identify"))
            dic.Add(dr1, dr2)
            Exit For
        End If
    Next
Next
For Each dr As DataRow In dic.keys
    dr1 = dic(dr)
    dr("第八列") = dr1("_Identify")
    dr("第九列") = dr1("第一列")
    dr("第十列") = dr1("第二列")
Next
Output.Show("计算结束, 耗时: " & (Date.Now - t1).TotalSeconds & "秒")

 

不过我倒有个意外收获,就是逻辑列的查询非常慢,追求效率的时候可以用整数或者字符列代替逻辑列。

[此贴子已经被作者于2010-12-15 8:01:01编辑过]

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


加好友 发短信
等级:二尾狐 帖子:512 积分:4146 威望:0 精华:0 注册:2009/10/8 16:43:00
  发帖心情 Post By:2010/12/15 8:42:00 [只看该作者]

 

不过我倒有个意外收获,就是逻辑列的查询非常慢,追求效率的时候可以用整数或者字符列代替逻辑列。

[此贴子已经被作者于2010-12-15 8:01:01编辑过]

受益了


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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2010/12/15 11:49:00 [只看该作者]

  图片点击可在新窗口打开查看4楼啊·····   图片点击可在新窗口打开查看 羡慕啊~~~ 竟然比1楼提高速度近快50多倍了(我这里要5秒。。。。。        

 

我再改进也只能达到百秒以内 ,只比1楼提高3倍左右~~~ 思路不对

[此贴子已经被作者于2010-12-15 11:49:42编辑过]

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


加好友 发短信
等级:三尾狐 帖子:746 积分:6673 威望:0 精华:1 注册:2008/9/1 11:46:00
  发帖心情 Post By:2010/12/15 17:20:00 [只看该作者]

四楼的代码够学习,琢磨的。试了后,好像第八列行号标注比实际的要大,按数据库1就是实际的2,小1是正常,现在是表示的比实际的大,好像100以内大1,200以后大2,10000号会标识为10007.  不知其他测试如何。

 回到顶部