¿Cómo puedo obtener una dimensión de una matriz bidimensional en VB.Net?
Pregunta
Tengo una aplicación en VBA que da a mi VB.Net DLL una variante bidimensional. Es un una matriz, en la que cada componente es una otra matriz que contiene dos posiciones.
Quiero obtener esta matriz de dos posiciones. Cuando estoy usando VBA que pueden acceder directamente a los datos de cada posición haciendo:
dataArray(index, 0) or dataArray(index, 1)
Y cuando quiero obtener la matriz de dos posiciones que puede utilizar:
Dim posArray as variant
posArray = dataArray(index)
posArray (0) contiene dataArray (índice, 0) y posArray (1) contiene dataArray (índice, 1).
Pero cuando estoy usando VB.Net, puedo acceder directamente a los datos, al igual que el primer ejemplo. Sin embargo, cuando intento para obtener una dimensión de la matriz de dos dimensiones, como lo hice en el segundo ejemplo, no es posible.
Dim posArray as Object
posArray = dataArray(index)
Se dice "intento para operar en una matriz con el número incorrecto de dimensiones."
He intentado todo para hacer que funcione, y no querer hacer la atribución a una, como:
posArray(0) = dataArray(index, 0)
posArray(1) = dataArray(index, 1)
Gracias por la ayuda.
Solución
Tendrá que giro a través de la matriz y generar 1D mismo. No hay ninguna llamada a la librería de .NET que lo haga por usted.
dim arraySlice as string[yourArrayWidth]
for index = 0 to yourArrayWidth
arraySlice[index] = yourArray[4, index]
next
El ejemplo anterior sería agarrar la fila 4 de yourArray y pegarlo en arraySlice para usted. Naturalmente, tendrá que limpiar eso y ponerlo en una función que acepta un rowIndex como parámetro (y otra función para dividir verticalmente que acepta un columnIndex).
Es pequeñas funciones como este que usted recoger lo largo de los años en su propia biblioteca de utilidades. 5 años a partir de ahora, se necesita de una ArraySlice y ya tendrá una función para hacerlo.
Otros consejos
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)
Después de BlockCopy
la 'outSingleDArr' contendrá {6, 7, 8, 9, 10}. Lo anterior se derivó de este post .