Foxtable(狐表)用户栏目专家坐堂 → [求助]多级字典如何存储?


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

主题:[求助]多级字典如何存储?

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


加好友 发短信
等级:三尾狐 帖子:651 积分:4945 威望:0 精华:0 注册:2016/1/16 22:42:00
[求助]多级字典如何存储?  发帖心情 Post By:2020/12/28 21:55:00 [只看该作者]

我想通过“ Sub字典保存函数(MainDc As Dictionary(Of String,Object) , ParamArray Args() As Object)”这样的函数实现
Sub字典保存函数(tDc ,“政策”,"水利",“供水”, "大水村",“已经施工”),让tDc(“政策”)("水利")(“供水”)("大水村")=“已经施工”,不管其中哪个主键没有,都能自动添加


 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111393 积分:567029 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/28 22:30:00 [只看该作者]

试试
Dim tDc2 As Dictionary(of String,object) = tDc

Dim s1() As String = Args
If s1.length > 1 Then
    Dim s3 As String = s1(s1.length - 1)
    For i As Integer = 0 To s1.length - 2
        If tDc2.ContainsKey(s1(i)) = False Then
            Dim dd As new Dictionary(of String,object)
            tDc2.Add(s1(i),dd)
            tDc2 = dd
        End If
    Next
    tDc2(s1(s1.length - 2)) = s3
End If

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


加好友 发短信
等级:三尾狐 帖子:651 积分:4945 威望:0 精华:0 注册:2016/1/16 22:42:00
  发帖心情 Post By:2020/12/30 22:52:00 [只看该作者]

Dim oldDc As New Dictionary(Of String, Object)
SetDicKeyVal( oldDc ,"A","AA","AAA","AAAA","VV" )
SetDicKeyVal( oldDc ,"A","AA","AAA","DDDD","RERERE" )
SetDicKeyVal( oldDc ,"A","AA","AAA","CCCC","CPCPCP" )
SetDicKeyVal( oldDc ,"A","BB","BBB","EEEE" )
SetDicKeyVal( oldDc ,"A","BB","CCC","FFFF" )
SetDicKeyVal( oldDc ,"A","BB","DDD","GGGG" )
Dim XDc As  Dictionary(Of String, Object) = oldDc("A")("AA")("AAA")  
For Each tKey As String In xDc.Keys
  Output.Show(tKey)
Next
结果是
AAAA
DDDD
CCCC
Dim oldDc As New Dictionary(Of String, Object)
SetDicKeyVal( oldDc ,"A","AA","AAA","AAAA","VV" )
SetDicKeyVal( oldDc ,"A","AA","AAA","DDDD","RERERE" )
SetDicKeyVal( oldDc ,"A","AA","AAA","CCCC","CPCPCP" )
SetDicKeyVal( oldDc ,"A","BB","BBB","EEEE" )
SetDicKeyVal( oldDc ,"A","BB","CCC","FFFF" )
SetDicKeyVal( oldDc ,"A","BB","DDD","GGGG" )
Output.Show( oldDc("A")("BB")("DDD"))
结果报错:Dictionary(Of String, Object) 转换到类型“string”的转换无效,我之前用一直都是好的

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111393 积分:567029 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/31 9:30:00 [只看该作者]

SetDicKeyVal函数代码发上来

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


加好友 发短信
等级:三尾狐 帖子:651 积分:4945 威望:0 精华:0 注册:2016/1/16 22:42:00
  发帖心情 Post By:2020/12/31 10:39:00 [只看该作者]

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

附件就是,谢谢


 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111393 积分:567029 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/31 11:38:00 [只看该作者]

Public Sub  SetDicKeyVal(MainDc As Dictionary(Of String,Object) , ParamArray Args() As Object) 'As Dictionary(Of String,Object)

Dim tDc2 As Dictionary(of String,object) = MainDc

Dim s1() As object = Args
If s1.length > 1 Then
    Dim s3 As String = s1(s1.length - 1)
    For i As Integer = 0 To s1.length - 3
        If tDc2.ContainsKey(s1(i)) = False Then
            Dim dd As new Dictionary(of String,object)
            tDc2.Add(s1(i),dd)
            tDc2 = dd
        Else
            tDc2 = tDc2(s1(i))
        End If
    Next
    tDc2(s1(s1.length - 2)) = s3
End If
End Sub


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


加好友 发短信
等级:三尾狐 帖子:651 积分:4945 威望:0 精华:0 注册:2016/1/16 22:42:00
  发帖心情 Post By:2020/12/31 23:03:00 [只看该作者]

谢谢蓝老师,为何我的内部函数有的是好的,有的说找不到,奇怪了,在函数管理器中明明在的

 回到顶部
帅哥,在线噢!
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111393 积分:567029 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/31 23:12:00 [只看该作者]

应该是某个函数有问题,导致编译异常,然后后面的函数就编译不了,所以找不到。看看是哪个名称的函数找不到,检查函数列表前面的函数代码。

另外全局代码有问题也可能导致函数编译异常

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


加好友 发短信
等级:三尾狐 帖子:651 积分:4945 威望:0 精华:0 注册:2016/1/16 22:42:00
  发帖心情 Post By:2021/1/1 17:30:00 [只看该作者]

蓝老师的SetDicKeyVal,我看了一天都没有看懂,如果我在最后一级发现有相同键及值,则删除之,又该如何实现?


 回到顶部
帅哥,在线噢!
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111393 积分:567029 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/1/3 9:52:00 [只看该作者]

就是一个递归的操作,一级一级处理。
同一个路径不可能会出现相同键及值的,请举例说明

 回到顶部