2
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 an array. That's why I am able to join it. I need to change one of the array's values. The obvious does not work. Why?

EDIT

I found out that it works if I do

Dim arr 
arr = list.item(0)
arr(0) = "Cherry"
list.item(0) = arr
user2366975
  • 4,350
  • 9
  • 47
  • 87

1 Answers1

4

Assignment of native VBScript arrays copies. Evidence:

>> 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 a VBScript array. You can assign it to list(0), but that gives list(0) a copy. Evidence:

>> 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

Your expression list.item(0) - or with less fuss: list(0) - in the statement

list.item(0)(0) = "Cherry"

refers to a copy of the array in list, assigning "Cherry" to its first element won't change the 'original' in list. Evidence: Your code.

What can you do?

(1) Get a copy from list(0), change the copy, assign the (full) copy to 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) Avoid VBScript arrays, use ArrayLists (or Dictionaries, or whatever collection that is not copied on assign) instead:

>> 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
Ekkehard.Horner
  • 38,498
  • 2
  • 45
  • 96