繁体   English   中英

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

[英]Efficient conversion of an array into a two-dimensional one using LINQ

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

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

您可以使用Buffer.BlockCopyblittable类型的 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

这利用了CLR将多维( 锯齿状!)阵列连续布局在存储器中的事实。

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

这不是一个二维数组,这是一个锯齿状的数组。 我假设你的意思是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;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM