Как я могу получить одно измерение из двумерного массива в VB.Net?

StackOverflow https://stackoverflow.com/questions/2344034

  •  23-09-2019
  •  | 
  •  

Вопрос

У меня есть приложение на VBA, которое предоставляет моей dll VB.Net один двумерный вариант.Это массив, в котором каждый компонент представляет собой другой массив, содержащий две позиции.

Я хочу получить этот двухпозиционный массив.Когда я использую VBA, я могу напрямую получить доступ к данным из каждой позиции, выполнив:

dataArray(index, 0) or dataArray(index, 1)

И когда я хочу получить двухпозиционный массив, я могу использовать:

Dim posArray as variant
posArray = dataArray(index)

posArray(0) содержит dataArray(index, 0), а posArray(1) содержит dataArray(index, 1).

Но когда я использую VB.Net, я могу получить прямой доступ к данным, как и в первом примере.Однако когда я пытаюсь получить одно измерение из двумерного массива, как во втором примере, это невозможно.

Dim posArray as Object
posArray = dataArray(index)

Пишет: «Попытка работать с массивом с неправильным числом измерений».

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

posArray(0) = dataArray(index, 0)
posArray(1) = dataArray(index, 1)

Спасибо вам за помощь.

Это было полезно?

Решение

Вам нужно будет прокрутить и сгенерировать 1D-массив самостоятельно.В .NET нет вызова библиотеки, который мог бы сделать это за вас.

dim arraySlice as string[yourArrayWidth]
for index = 0 to yourArrayWidth
  arraySlice[index] = yourArray[4, index]
next

В приведенном выше примере строка 4 будет извлечена из вашего массива и вставлена ​​​​в arraySlice.Естественно, вам захочется очистить это и поместить в функцию, которая принимает индекс строки в качестве параметра (и другую функцию для вертикального разделения, которая принимает индекс столбца).

Именно такие маленькие функции вы со временем соберете в свою собственную библиотеку утилит.Через 5 лет вам понадобится ArraySlice, и у вас уже будет функция для этого.

Другие советы

Dim Dim1Len As Integer = 5
Dim Dim2Len As Integer = 2
Dim DimToExtract As Integer = 2
Dim inMultiDArr(5, 2) As Integer
inMultiDArr = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}}
Dim outSingleDArr(5) As Integer
outSingleDArr = {0, 0, 0, 0, 0}

Buffer.BlockCopy(inMultiDArr, Marshal.SizeOf(GetType(Integer)) * Dim1Len * (DimToExtract - 1),
                 outSingleDArr, 0, Marshal.SizeOf(GetType(Integer)) * Dim1Len)

После BlockCopy 'outSingleDArr' будет содержать { 6, 7, 8, 9, 10 }.Вышеупомянутое было получено из эта почта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top