如何将一行值从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中),而且多维数组就是这样的语法糖。
回答你的问题:不。你必须循环这些值。
上述就是C#学习教程:如何将一行值从2D数组复制到一维数组?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/990239.html