我是不是对 Dictionary有什么误解?

ruhong1 2019-04-09 11:33:10
第一次:
Dim jj As New Dictionary(Of String, Boolean) From {{"A", False}, {"B", False}}
MsgBox(jj(1))
提示:给定关键字不在字典中。

第二次:
Dim jj As New Dictionary(Of String, Boolean) From {{"A", False}, {"B", False}}
jj(1) = True
MsgBox(jj(1))
MsgBox(jj("B"))
结果第一个Msg 显示 "true"
第二个显示 "false"
我真的,完全给整糊涂了,我现在都不敢继续写下去了。
...全文
1768 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
syw1990330 2021-06-15
  • 打赏
  • 举报
回复

基础水平太差了

jhonsonzhang 2019-04-18
  • 打赏
  • 举报
回复
写法错误,根本不是VB.net语言问题。
msgbox(jj(1).key) or msgbox(jj(0).value)
非常简捷和严谨的语言
  • 打赏
  • 举报
回复
假设不小心写
jj(a)
我就希望编译器告诉我a的类型不是 integer 而是 string,希望编译器中断,不希望这方面过于“贴心”。
  • 打赏
  • 举报
回复
有些地方“过分灵活”(甚至是某些语句运行1万次以后遇到个别数据时才在用户面前丢人现眼地直接崩溃)其实不会让语言变强,而是会极大地降低调试效率、降低产品质量,使得编程调试成为一项体力活儿。所以我并不欣赏所谓的“动态语言”。编程语言要有动态特性,例如 dynamic 之类的,但是对于语言的动态特征一定要克制,不能盲目理解使用。
橘子皮... 2019-04-12
  • 打赏
  • 举报
回复
引用 3 楼 以专业开发人员为伍 的回复:
看上去这是 vb.net 语言过分“贴心”造成的尴尬。vb.net 总是过分自动地假设你的代码的语义,它总是自以为是地加上 ToString 转换。 这要放在 c# 语言中就不会出现这种问题。因为 c# 从来不会把第一段代码中的数字1当作字符串“1”。
我觉得只要熟悉了语法,vb这种灵活不是坏事,相比连变量类型都不需要定义的python, vb 这算小儿科了不是么 楼主他自己吧dictionary当成数组来用怪谁呢,dictionary() 里的不是数组的下标,是key
hztltgg 2019-04-10
  • 打赏
  • 举报
回复
引用 11 楼 以专业开发人员为伍 的回复:
历史原因还不解决?
唉.......现在vb.net已经够惨了,官方都对他爱答不理了。
  • 打赏
  • 举报
回复
唉,主要还是 vb.net 的语义习惯问题,不是 .net framework 的 Dictionary 的问题。
  • 打赏
  • 举报
回复
Dictionary 的带参数属性(set 方法),确实是“如果找到则Update,如果找不到则Add”的机制。
stherix 2019-04-09
  • 打赏
  • 举报
回复
引用 5 楼 ruhong1 的回复:
[quote=引用 3 楼 以专业开发人员为伍 的回复:] 看上去这是 vb.net 语言过分“贴心”造成的尴尬。vb.net 总是过分自动地假设你的代码的语义,它总是自以为是地加上 ToString 转换。 这要放在 c# 语言中就不会出现这种问题。因为 c# 从来不会把第一段代码中的数字1当作字符串“1”。
我还以为要 add,他才增加, 我 jj(1),他就自己增加了? 那么,如果我想找到键为"B"的value,并修改他,如何做?[/quote] 看源码就知道 用赋值,如果不存在则Add,存在则替换值
ruhong1 2019-04-09
  • 打赏
  • 举报
回复
引用 3 楼 以专业开发人员为伍 的回复:
看上去这是 vb.net 语言过分“贴心”造成的尴尬。vb.net 总是过分自动地假设你的代码的语义,它总是自以为是地加上 ToString 转换。

这要放在 c# 语言中就不会出现这种问题。因为 c# 从来不会把第一段代码中的数字1当作字符串“1”。


我还以为要 add,他才增加,
我 jj(1),他就自己增加了?
那么,如果我想找到键为"B"的value,并修改他,如何做?
  • 打赏
  • 举报
回复
引用 2 楼 hztltgg 的回复:
第二次jj(1) = True,其实是字典加了一项,现在有三项了,“1”是True “A”是false “B”是False。
是这样的!
  • 打赏
  • 举报
回复
看上去这是 vb.net 语言过分“贴心”造成的尴尬。vb.net 总是过分自动地假设你的代码的语义,它总是自以为是地加上 ToString 转换。 这要放在 c# 语言中就不会出现这种问题。因为 c# 从来不会把第一段代码中的数字1当作字符串“1”。
hztltgg 2019-04-09
  • 打赏
  • 举报
回复
你的Dictionary是泛型字典,key是字符串,所以 1 表示的是 “1”字符串,和“A”没有关系,不表示第一项,字典和集合不一样。 第二次jj(1) = True,其实是字典加了一项,现在有三项了,“1”是True “A”是false “B”是False。 建议你设置 Option Strict Off ,不然vb.net 会自动转换,反而会引入运行时错。
ruhong1 2019-04-09
  • 打赏
  • 举报
回复
使用的是 vs 2010
  • 打赏
  • 举报
回复
历史原因还不解决?
hztltgg 2019-04-09
  • 打赏
  • 举报
回复
引用 3 楼 以专业开发人员为伍 的回复:
看上去这是 vb.net 语言过分“贴心”造成的尴尬。vb.net 总是过分自动地假设你的代码的语义,它总是自以为是地加上 ToString 转换。 这要放在 c# 语言中就不会出现这种问题。因为 c# 从来不会把第一段代码中的数字1当作字符串“1”。
应该也不是贴心吧,历史原因,为了兼容老代码,只是现在vs选项的vb默认值里虽然Option Explicit 设置为 On了,但Option Strict 默认还是Off。
  • 打赏
  • 举报
回复
要“今年查找”并且修改,你可以首先使用
jj("B")
并判断结果是不是 nothing,或者使用 TryGetValue 来判断。

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧