为数组中的现有项目分配新值 (VBS)
Assign a new value to an existing item in an array (VBS)
Option Explicit
dim list
Set list = CreateObject("System.Collections.ArrayList")
list.Add split("Banana;Apple;Pear",";")
WScript.Echo join(list.item(0), ", ") ' --> Banana, Apple, Pear
WScript.Echo list.item(0)(0) ' --> Banana
list.item(0)(0) = "Cherry"
WScript.Echo list.item(0)(0) ' --> Banana (Why not Cherry?)
list.item(0)
returns 一个数组。这就是为什么我能够加入它。我需要更改数组的其中一个值。显而易见的是行不通的。为什么?
编辑
我发现这样做是可行的
Dim arr
arr = list.item(0)
arr(0) = "Cherry"
list.item(0) = arr
本机 VBScript 数组副本的分配。证据:
>> Dim a : a = Split("a b c")
>> Dim b : b = a
>> b(0) = "A"
>> WScript.Echo Join(a)
>> WScript.Echo Join(b)
>>
a b c
A b c
Split() returns 一个 VBScript 数组。您可以将它分配给 list(0),但这会为 list(0) 提供一个副本。证据:
>> Dim list : Set list = CreateObject("System.Collections.ArrayList")
>> Dim a : a = Split("a b c")
>> list.Add a
>> a(0) = "A"
>> WScript.Echo Join(a)
>> WScript.Echo Join(list(0))
>>
A b c
a b c
你的表达 list.item(0)
- 或不那么大惊小怪:list(0)
- 在声明
list.item(0)(0) = "Cherry"
指的是列表中数组的副本,将"Cherry"分配给它的第一个元素不会改变列表中的'original'。证据:你的代码。
你能做什么?
(1) 从 list(0) 获取副本,更改副本,将(完整)副本分配给 list(0):
>> Dim list : Set list = CreateObject("System.Collections.ArrayList")
>> Dim a : a = Split("a b c")
>> list.Add a
>> Dim b : b = list(0)
>> b(0) = "Cherry"
>> list(0) = b
>> WScript.Echo Join(list(0))
>>
Cherry b c
(2) 避免使用 VBScript 数组,而是使用 ArrayList(或字典,或任何 not 赋值时复制的集合):
>> Dim list1 : Set list1 = CreateObject("System.Collections.ArrayList")
>> Dim list2 : Set list2 = CreateObject("System.Collections.ArrayList")
>> list2.Add "Banana"
>> list2.Add "Apple"
>> list1.Add list2
>> WScript.Echo Join(list1(0).ToArray())
>> list1(0)(0) = "Cherry"
>> WScript.Echo Join(list1(0).ToArray())
>>
Banana Apple
Cherry Apple
Option Explicit
dim list
Set list = CreateObject("System.Collections.ArrayList")
list.Add split("Banana;Apple;Pear",";")
WScript.Echo join(list.item(0), ", ") ' --> Banana, Apple, Pear
WScript.Echo list.item(0)(0) ' --> Banana
list.item(0)(0) = "Cherry"
WScript.Echo list.item(0)(0) ' --> Banana (Why not Cherry?)
list.item(0)
returns 一个数组。这就是为什么我能够加入它。我需要更改数组的其中一个值。显而易见的是行不通的。为什么?
编辑
我发现这样做是可行的
Dim arr
arr = list.item(0)
arr(0) = "Cherry"
list.item(0) = arr
本机 VBScript 数组副本的分配。证据:
>> Dim a : a = Split("a b c")
>> Dim b : b = a
>> b(0) = "A"
>> WScript.Echo Join(a)
>> WScript.Echo Join(b)
>>
a b c
A b c
Split() returns 一个 VBScript 数组。您可以将它分配给 list(0),但这会为 list(0) 提供一个副本。证据:
>> Dim list : Set list = CreateObject("System.Collections.ArrayList")
>> Dim a : a = Split("a b c")
>> list.Add a
>> a(0) = "A"
>> WScript.Echo Join(a)
>> WScript.Echo Join(list(0))
>>
A b c
a b c
你的表达 list.item(0)
- 或不那么大惊小怪:list(0)
- 在声明
list.item(0)(0) = "Cherry"
指的是列表中数组的副本,将"Cherry"分配给它的第一个元素不会改变列表中的'original'。证据:你的代码。
你能做什么?
(1) 从 list(0) 获取副本,更改副本,将(完整)副本分配给 list(0):
>> Dim list : Set list = CreateObject("System.Collections.ArrayList")
>> Dim a : a = Split("a b c")
>> list.Add a
>> Dim b : b = list(0)
>> b(0) = "Cherry"
>> list(0) = b
>> WScript.Echo Join(list(0))
>>
Cherry b c
(2) 避免使用 VBScript 数组,而是使用 ArrayList(或字典,或任何 not 赋值时复制的集合):
>> Dim list1 : Set list1 = CreateObject("System.Collections.ArrayList")
>> Dim list2 : Set list2 = CreateObject("System.Collections.ArrayList")
>> list2.Add "Banana"
>> list2.Add "Apple"
>> list1.Add list2
>> WScript.Echo Join(list1(0).ToArray())
>> list1(0)(0) = "Cherry"
>> WScript.Echo Join(list1(0).ToArray())
>>
Banana Apple
Cherry Apple