将某个二维数组索引下的数据移动到一维数组

Posted

技术标签:

【中文标题】将某个二维数组索引下的数据移动到一维数组【英文标题】:Move data under a certain 2D array index to 1D array 【发布时间】:2016-11-15 08:15:40 【问题描述】:

我想将所有数据从二维数组的第 0 列移动到单独的一维数组。到目前为止我有这个:

for (int x = 0; x < 100; x++)  //100 is the amount of rows in the 2D array
    array1D[x] = array2D[x, 0]; //0 is the column I want to take from

是否有更好/更有效的方法来实现相同的结果?

【问题讨论】:

必须使用不安全的代码——如果数组是锯齿状的,你可以切掉一列,但是对于矩形数组没有这样的选项。除非这是一个重大性能问题,否则不值得麻烦恕我直言。 如果是性能问题,重组数据结构可能比尝试优化该特定操作带来更多好处(这可能已经足够接近最佳值 - 当代码运行时使用发布版本优化时检查生成的程序集)。无论如何 - 在改变之前测量...... 附注请更新您的问题,说明您正在寻找哪种类型的改进:Code Review 上可能会更好地询问代码样式,性能问题需要目标 + 当前数字,... 【参考方案1】:

您无法复制列,但可以使用Buffer.BlockCopy()复制行

class Program

    static void FillArray(out int[,] array)
    
        // 2 rows with 100 columns
        array=new int[2, 100];
        for (int i=0; i<100; i++)
        
            array[0, i]=i;
            array[1, i]=100-i;
        
    
    static void Main(string[] args)
    
        int[,] array2D;
        FillArray(out array2D);
        var first_row=new int[100];
        var second_row=new int[100];

        int bytes=sizeof(int);
        Buffer.BlockCopy(array2D, 0, first_row, 0, 100*bytes);
        // 0, 1, 2, ...
        Buffer.BlockCopy(array2D, 100*bytes, second_row, 0, 100*bytes);
        // 100, 99, 98, ..
    

更新

这是一个扩展方法,从二维数组(任何类型)中提取单行

    public static T[] GetRow<T>(this T[,] array, int rowIndex)
    
        int n = array.GetLength(1);
        var row = new T[n];
        var size = Buffer.ByteLength(row);
        Buffer.BlockCopy(array, rowIndex*size, row, 0, size);
        return row;
    

用作

    var array = new double[3, 3] 
         1, 2, 3 ,
         4, 5, 6 ,
         7 ,8, 9  ;

    var second = array.GetRow(1);
    // 4, 5, 6

【讨论】:

以上是关于将某个二维数组索引下的数据移动到一维数组的主要内容,如果未能解决你的问题,请参考以下文章

php将一个二维数组按照某个字段值合并成一维数组,如果有重复则将重复的合并成二维数组

将一维数组的索引转换为二维数组 i。 e.行列

php中一个二维数组,怎么吧数组中的数据作为value插入到数据库某个表中

创建二维数组(一维长度3,二维长度6),值为一维数组和二维数组索引值的积

创建二维数组(一维长度3,二维长度6),值为一维数组和二维数组索引值的积,

python中如何将多个一维数组变成二维数组