我想在C#中以高效的方式执行以下操作,最好使用LINQ。
Array[Length]
到Array[Length/Row][Row]
其中Row
和Length
是变量。
答案 0 :(得分:3)
您可以使用Buffer.BlockCopy在blittable 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;
}
注意:该方法假定项目可以均分为行。