ОП указывается после декартового произведения . Как подсказывает @the_lotus, OP должен, вероятно, использовать здесь List
, так как у вас будет более жесткий контроль над длиной каждого уровня в данном измерении. Как и в случае с массивами, мы должны выполнить небольшую гимнастику петель, чтобы найти длину каждого уровня.
Вот алгоритм, который производит картезианский продукт, избегая при этом генерации промежуточных продуктов (например, "aaa "
, "aaa ddd "
и т. Д.)
Dim array1(0 To 2, 0 To 2) As String, i As Long, j As Long
Dim myProd As Long, sizeDim() As Long, loopLim As Long, test As Long
Dim lenArr As Long, myCounter() As Long, myComb As String
array1(0, 0) = "aaa "
array1(0, 1) = "bbb "
array1(0, 2) = "ccc "
array1(1, 0) = "ddd "
array1(1, 1) = "eee "
array1(2, 0) = "fff "
array1(2, 1) = "ggg "
lenArr = UBound(array1, 1)
myProd = 1
ReDim sizeDim(0 To lenArr)
For j = 0 To lenArr
test = UBound(array1, 2)
'' Find the last non-empty entry
Do While Len(array1(j, test) & vbNullString) = 0
test = test - 1
Loop
myProd = myProd * (test + 1)
sizeDim(j) = test
Next j
ReDim myCounter(0 To lenArr)
loopLim = myProd - 1
myComb = vbNullString
Dim cartProd() as String
Redim cartProd(0 to loopLim)
For i = 0 To loopLim - 1
For j = 0 To lenArr
myComb = myComb & array1(j, myCounter(j))
Next j
cartProd(i) = myComb
Console.Writeline(myComb)
test = 0
Do While (myCounter(test) = sizeDim(test))
myCounter(test) = 0
test = test + 1
Loop
myCounter(test) = myCounter(test) + 1
myComb = vbNullString
Next i
'' Get last result
For j = 0 To lenArr
myComb = myComb & array1(j, myCounter(j))
Next j
cartProd(loopLim) = myComb
Console.Writeline(myComb)
А вот и вывод:
aaa ddd fff
bbb ddd fff
ccc ddd fff
aaa eee fff
bbb eee fff
ccc eee fff
aaa ddd ggg
bbb ddd ggg
ccc ddd ggg
aaa eee ggg
bbb eee ggg
ccc eee ggg