2012-02-17 27 views
6

Estoy convirtiendo una matriz bidimensional en una dimensión única en C#. Recibo la matriz bidimensional del dispositivo (C++) y luego la convierto a 1 dimensión en C#. Aquí está mi código:¿Cómo convertir una matriz bidimensional a una dimensión única en C#?

int iSize = Marshal.SizeOf(stTransactionLogInfo); //stTransactionLogInfo is a structure 
byte[,] bData = (byte[,])objTransLog; //objTransLog is 2 dimensionl array from device 
byte[] baData = new byte[iSize]; 

for (int i = 0; i < bData.GetLength(0); i++) 
{ 
    for (int j = 0; j < iSize; j++) 
    { 
     baData[j] = bData[i, j]; 
    } 
} 

consigo el resultado deseado desde arriba de código, pero el problema es que no es la forma habitual de aplicación. Quiero saber cómo se puede hacer de forma estándar. Puede estar haciendo Marshalling, no estoy seguro. Gracias de antemano.

+1

¿Por qué crees que no es la forma estándar? Me parece bien. –

Respuesta

12

Puede utilizar la Buffer.BlockCopy Method:

byte[,] bData = (byte[,])objTransLog; 

byte[] baData = new byte[bData.Length]; 

Buffer.BlockCopy(bData, 0, baData, 0, bData.Length); 

Ejemplo:

byte[,] bData = new byte[4, 3] 
{ 
    { 1, 2, 3 }, 
    { 4, 5, 6 }, 
    { 7, 8, 9 }, 
    { 10, 11, 12 } 
}; 

byte[] baData = new byte[bData.Length]; 

Buffer.BlockCopy(bData, 0, baData, 0, bData.Length); 

// baData == { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 } 
+0

Esto no me está dando el resultado deseado.Buffer.BlockCopy estará dentro del ciclo? – user662285

+0

He agregado un ejemplo. Un bucle 'for' no es necesario. – dtb

+0

Bien. Ahora el problema es Copiará todos los datos a la vez. Pero quiero datos en bloques del tamaño de Mi estructura (supongamos que el tamaño es 270) porque estoy usando estos datos binarios para formar Mi estructura. La estructura consta de varios campos que se están llenando de datos y en Último estoy mostrando estos datos en una cuadrícula, fila por fila. – user662285

4

método más simple

int iSize = Marshal.SizeOf(stTransactionLogInfo); //stTransactionLogInfo is a structure 
byte[,] bData = (byte[,])objTransLog; //objTransLog is 2 dimensionl array from device 
byte[] baData = bData.Cast<byte>().ToArray(); 
1

fácil de understend y c onver a un idioma diferente.

// Create 2D array (20 rows x 20 columns) 
int row = 20; 
int column = 20; 
int [,] array2D = new int[row, column]; 

// paste into array2D by 20 elements 
int x = 0; // row 
int y = 0; // column 

for (int i = 0; i < my1DArray.Length; ++i) 
{ 
    my2DArray[x, y] = my1DArray[i]; 
    y++; 
    if (y == column) 
    { 
      y = 0;  // reset column 
      x++;  // next row 
    } 
} 
0

bData.Cast<byte>() convertirá la matriz multidimensional en una sola dimensión.

Esto hará boxeo, unboxing por lo que no es la forma más eficiente, pero es sin duda la más simple y más segura.

Cuestiones relacionadas