使用LINQ将数组高效转换为二维数组

时间:2010-09-20 21:59:55

标签: c# linq multidimensional-array

我想在C#中以高效的方式执行以下操作,最好使用LINQ。

Array[Length]Array[Length/Row][Row]其中RowLength是变量。

2 个答案:

答案 0 :(得分:3)

您可以使用Buffer.BlockCopyblittable types的n维数组之间进行有效转换:

int[] a = new int[] { 1, 2, 3, 4, 5, 6 };

int rows = 2;
int columns = a.Length / rows;
int[,] b = new int[columns, rows];

Buffer.BlockCopy(a, 0, b, 0, sizeof(int) * a.Length);

// b[0, 0] == 1
// b[0, 1] == 2
// b[1, 0] == 3
// b[1, 1] == 4
// b[2, 0] == 5
// b[2, 1] == 6

这利用了多维( not 锯齿状!)数组由CLR在内存中连续布局的事实。

对于非blittable类型,只需使用一些好的'for循环。

答案 1 :(得分:1)

那不是二维数组,那是一个锯齿状的数组。我认为你的意思是Array[Length/Row,Row]

LINQ中没有任何内容可以做到这一点,所以如果你想使用它,你会有一些开销。最高效的方式是直接的代码:

public T[,] MakeRows<T>(T[] values, int rowSize) {
  T[,] result = new T[values.Length / rowSize, rowSize];
  int row = 0, col = 0;
  foreach (T value in values) {
    resul[row, col] = value;
    if (++col == rowsize) {
      col = 0;
      row++;
    }
  }
  return result;
}

注意:该方法假定项目可以均分为行。