Как я могу получить одно измерение из двумерного массива в VB.Net?
Вопрос
У меня есть приложение на 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 }.Вышеупомянутое было получено из эта почта.