[英]Efficient conversion of an array into a two-dimensional one using LINQ
我想在C#中以高效的方式执行以下操作,最好使用LINQ。
Array[Length]
to Array[Length/Row][Row]
其中Row
和Length
是变量。
您可以使用Buffer.BlockCopy在blittable类型的 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.