Как я могу получить одно измерение из двумерного массива в VB.Net? - PullRequest
0 голосов
/ 26 февраля 2010

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

Я хочу получить этот двухпозиционный массив. Когда я использую 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)

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

Ответы [ 2 ]

2 голосов
/ 26 февраля 2010

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

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

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

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

1 голос
/ 29 августа 2013
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}. Вышеуказанное было взято из этого поста .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...