如何将一行值从2D数组复制到一维数组?

我们有以下对象

int [,] oGridCells; 

它仅用于固定的第一个索引

 int iIndex = 5; for (int iLoop = 0; iLoop < iUpperBound; iLoop++) { //Get the value from the 2D array iValue = oGridCells[iIndex, iLoop]; //Do something with iValue } 

在.NET中是否有办法将固定的第一个索引处的值转换为单个维度数组(除了通过循环值)?

如果数组只循环一次,我怀疑它会加速代码(并且可能会使代码变慢)。 但是如果数组被大量操作,那么单维数组比多维数组更有效。

我提出这个问题的主要原因是看它是否可以完成以及如何完成,而不是将其用于生产代码。

以下代码演示了将16字节(4个整数)从2-Darrays复制到1-Darrays。

 int[,] oGridCells = {{1, 2}, {3, 4}}; int[] oResult = new int[4]; System.Buffer.BlockCopy(oGridCells, 0, oResult, 0, 16); 

您还可以通过提供正确的字节偏移量,从arrays中选择性地仅复制一行。 此示例复制3行2-D数组的中间行。

 int[,] oGridCells = {{1, 2}, {3, 4}, {5, 6}}; int[] oResult = new int[2]; System.Buffer.BlockCopy(oGridCells, 8, oResult, 0, 8); 

编辑:

我意识到有办法! 当然,它可能不值得。 使用不安全的代码 。 完整示例,显示两种方式,下面是不安全的:

 public class MultiSingleUnsafe { public static unsafe void Main(String[] a) { int rowCount = 6; int iUpperBound = 10; int [,] oGridCells = new int[rowCount, iUpperBound]; int iIndex = rowCount - 2; // Pick a row. for(int i = 0; i < iUpperBound; i++) { oGridCells[iIndex, i] = i; } for (int iLoop = 0; iLoop < iUpperBound; iLoop++) { //Get the value from the 2D array int iValue = oGridCells[iIndex, iLoop]; Console.WriteLine("Multi-dim array access iValue: " + iValue); //Do something with iValue } fixed(int *lastRow = &(oGridCells[iIndex,0])) { for (int iLoop = 0; iLoop < iUpperBound; iLoop++) { int iValue = lastRow[iLoop]; Console.WriteLine("Pointer access iValue: " + iValue); } } } } 

我不知道在C#中将多维数组转换为一维数组。 当然,您可以创建一个新的一维数组并将其复制到其中。 但即使你多次循环这些值,我也不认为这会带来性能上的好处。 正如达人所说,无论如何,它内部都是指针运算。 如果您想确定,请对其进行分析。

您无法获得每个数组的引用。 但是,您可以使用锯齿状arrays 。

“但如果数组被大量操作,那么单维数组将比多维数组更有效。”

我去年夏天做了一些确切的分析,并惊讶地发现2D和1Darrays之间的性能没有显着差异。

我没有测试锯齿状arrays的性能。

你可以试试这个:

  int[,] twoD = new int[2,2]; twoD[0, 0] = 1; twoD[0, 1] = 2; twoD[1, 0] = 3; twoD[1, 1] = 4; int[] result = twoD.Cast().Select(c => c).ToArray(); 

结果将是一个包含数据的整数数组:

 1, 2, 3, 4 

如果可能的话,我会感到惊讶:我敢打赌oGridCells[iIndex, iLoop]只是oGridCells[iIndex * iLoop]的一种简写(内部,在MSIL中),而且多维数组就是这样的语法糖。

回答你的问题:不。你必须循环这些值。