Как добавить 2d массив с 1d массивом в VB? - PullRequest
0 голосов
/ 20 ноября 2018

У меня трудности с поиском способа добавления 1d-массива в 2d-массив в VB.Например:

Dim arr(,) As Integer
arr = { {0, 1}, {2, 3}, {4, 5} }
arr{3} = {6, 7}
'Now arr should be = { {0, 1}, {2, 3}, {4, 5}, {6, 7} }

Обратите внимание, что приведенный выше код является просто демонстрацией того, чего я хочу достичь, он не работает.

Я пыталсячто предлагается на форуме, например:

  1. ReDim Preserve
  2. Array.Resize
  3. Создание 2d-цикла для копирования элемента everysingle в новую переменную и добавления нового элемента, затем ReDimвернемся к arr

Все, что я пытался, но, похоже, все они не работают.В конце дня я ищу подпрограмму, которая может добавить 2d массив неизвестной длины, например:

Dim arr(,) As Integer
append(arr, {0, 1})
append(arr, {2, 3})
'Now arr should be = {{0, 1}, {2, 3}}

1 Ответ

0 голосов
/ 20 ноября 2018

Вам необходимо Redim Preserve массив, но вы не можете сделать это, потому что он добавляет другой столбец, когда вы хотите другую строку.Таким образом, вам нужно будет определить новый массив и скопировать данные:

Public Sub Append2DRow(ByRef arr(,) As Integer, new_row(,) As Integer)
    Dim new_arr(,) As Integer
    ReDim new_arr(0 To UBound(arr, 1) + 1, 0 To 1)

    Array.Copy(arr, new_arr, arr.LongLength)

    new_arr(UBound(new_arr, 1), 0) = new_row(0, 0)
    new_arr(UBound(new_arr, 1), 1) = new_row(0, 1)

    arr = new_arr
End Sub

Public Sub Append1DRow(ByRef arr(,) As Integer, new_row() As Integer)
    Dim new_arr(,) As Integer
    ReDim new_arr(0 To UBound(arr, 1) + 1, 0 To 1)

    Array.Copy(arr, new_arr, arr.LongLength)

    new_arr(UBound(new_arr, 1), 0) = new_row(0)
    new_arr(UBound(new_arr, 1), 1) = new_row(1)

    arr = new_arr
End Sub
Dim arr(,) As Integer
arr = {{0, 1}, {2, 3}, {4, 5}}

Append2DRow(arr, {{6, 7}})
Append1DRow(arr, {6, 7})

Вы можете избежать этой проблемы, заставив себя иметь массив с двумя строками и переменным числом столбцов, но затем выЯ не смогу его так легко инициализировать, и, вероятно, будет сложнее работать с ним:

Public Sub Append2DRow(ByRef arr(,) As Integer, new_row(,) As Integer)
    ReDim Preserve arr(0 To 1, 0 To UBound(arr, 2) + 1)
    arr(0, UBound(arr, 2)) = new_row(0, 0)
    arr(1, UBound(arr, 2)) = new_row(0, 1)
End Sub

Public Sub Append1DRow(ByRef arr(,) As Integer, new_row() As Integer)
    ReDim Preserve arr(0 To 1, 0 To UBound(arr, 2) + 1)
    arr(0, UBound(arr, 2)) = new_row(0)
    arr(1, UBound(arr, 2)) = new_row(1)
End Sub
Dim arr(0 To 1, 0 To 2) As Integer
arr(0, 0) = 0 : arr(1, 0) = 1
arr(0, 1) = 2 : arr(1, 1) = 3
arr(0, 2) = 4 : arr(1, 2) = 5

Append2DRow(arr, {{6, 7}})
Append1DRow(arr, {6, 7})

Однако для этого не стоит использовать массивы для начала.Вы должны использовать списки:

Dim list = New List(Of Integer()) From {
    New Integer() {0, 1},
    New Integer() {2, 3},
    New Integer() {4, 5}
}

list.Add({6, 7})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...