Преобразование двухмерного массива в одномерный в C #? - PullRequest
6 голосов
/ 17 февраля 2012

Я конвертирую двумерный массив в одномерный в C #. Я получаю 2-мерный массив с устройства (C ++) и затем преобразую его в 1-мерный в 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];
    }
}

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

Ответы [ 4 ]

14 голосов
/ 17 февраля 2012

Вы можете использовать метод Buffer.BlockCopy :

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

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

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

Пример:

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 }
6 голосов
/ 02 октября 2015

Самый простой метод

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 голос
/ 14 ноября 2017

bData.Cast<byte>() преобразует многомерный массив в одно измерение.

Это сделает бокс, распаковку не самым эффективным способом, но, безусловно, самым простым и безопасным.

1 голос
/ 23 июля 2016

легко понять и конвертировать на другой язык.

// 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
     }
}
...