以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]集合的长度为什么会变化  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=145304)

--  作者:chnfo
--  发布时间:2020/1/15 16:48:00
--  [求助]集合的长度为什么会变化
定义了一个集合变量A,然后把这个变量赋给B
在运行过程中,当B的集合元素变化时,集合A的元素也变了,这是为什么?
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:集合问题.zip


--  作者:有点蓝
--  发布时间:2020/1/15 16:58:00
--  
正常。集合属于引用对象,变量引用的是对象的内存地址,集合变量A赋给B,A和B引用的都是同一个对象的内存地址
--  作者:chnfo
--  发布时间:2020/1/15 17:20:00
--  
问题是我要用源集合变量A去做一些判断,如果它要随副本B动态变化,那岂不是就搞不成了?

可以运行自定义函数(项目中只有一个自定义函数),里面我写了注释。

总不能在每一次遍历的时候,再把源集合变量A计算一次吧

例如源集合变量X=datatables("A").getvalues("ID","Temp = 1")

然后遍历时
dim y as new  list(of string) 
for each dr as datarow in datatables("B").datarows
y = x 
if *** then 
y.remove(dr("BID"))  \'----结果是y移除了某一个无素,X也同时移除了,这个有点问题吧,我的理解,y只是一个副本,它移除了某个元素Z,但X应当还有这个元素Z啊
end if 
next
[此贴子已经被作者于2020/1/15 17:26:31编辑过]

--  作者:有点蓝
--  发布时间:2020/1/15 17:33:00
--  
什么是对象引用,什么是值引用?百度学习一下。

那就不要直接赋值,新建一个集合,和A集合的项目给B集合

Dim y As new  List(of String)
y.Add("1")
y.Add("2")
Dim x As new  List(of String)
x.AddRange(y)
x.Remove("1")

For Each s As String In y
    Output.Show(s)
Next
Output.Show("*********")
For Each s As String In x
    Output.Show(s)
Next

--  作者:chnfo
--  发布时间:2020/1/15 17:47:00
--  
原来如彼,刚刚还看了这节帮助,还以为赋值即可