在C#中将二维数组转换为一维数组?

13

我正在将C#中的二维数组转换为一维数组。 我从设备(C++)接收到二维数组,然后在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];
    }
}

我从上面的代码中得到了期望的结果,但问题在于这不是标准的实现方式。 我想知道如何用标准的方式实现。 也许需要做序列化,我不确定。 提前感谢。


1
你为什么认为这不是标准的方式?在我看来很好啊。 - Jeow Li Huan
5个回答

17
你可以使用Buffer.BlockCopy方法:Buffer.BlockCopy Method
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 }

这不是我想要的结果。Buffer.BlockCopy会在for循环内部吗? - Bokambo
那么,为什么你不使用 stTransactionLogInfo[] 而是使用 byte[,] 呢? - dtb
1
使用BlockCopy方法与@Rakin的答案bData.Cast<byte>().ToArray();相比有什么优势? - MPaul
示例之所以有效,是因为它是一个字节数组。如果您想使其他类型(例如整数数组)也起作用,则需要获取数组的字节长度 int byteLength = Buffer.ByteLength(baData); 然后将其作为最后一个参数传递给Buffer.BlockCopy。最后一个参数应该是字节长度而不是数组长度。 - Nick Polyak
补充@NickPolyak的评论:通常这仅适用于具有固定字节大小的已知基本数据类型。例如,对于“字符串”或任何其他动态大小类型,它将失败。 - derHugo
显示剩余2条评论

11

最简单的方法

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();

4

bData.Cast<byte>()将多维数组转换为单个维度。

这将进行装箱、拆箱操作,因此不是最高效的方式,但肯定是最简单和最安全的方式。


2
如果二维数组的列大小是动态的,下面的代码可以使用:
    public static T[] Convert2DArrayTo1D<T>(T[][] array2D)
    {
        List<T> lst = new List<T>();
        foreach(T[] a in array2D)
        {
            lst.AddRange(a);
        }
        return lst.ToArray();
    }

1
易于理解并转换为不同语言。
// 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
     }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接