在 C# 中移动二维数组

Posted

技术标签:

【中文标题】在 C# 中移动二维数组【英文标题】:Shifting a 2D array in C# 【发布时间】:2021-02-04 05:33:49 【问题描述】:

我有一个如下所示的二维数组:

values = new int[11, 11] 
         00, 00, 00, 00, 00, 20, 20, 20, 20, 20, 20,
         00, 20, 20, 20, 00, 20, 20, 20, 20, 20, 20,
         00, 00, 20, 20, 00, 20, 20, 20, 20, 20, 20,
         20, 20, 20, 20, 00, 00, 00, 00, 00, 00, 20,
         20, 20, 20, 20, 20, 20, 20, 20, 20, 00, 20,
         20, 20, 20, 20, 20, 20, 20, 20, 20, 00, 20,
         20, 20, 20, 20, 20, 20, 00, 00, 00, 00, 20,
         20, 20, 20, 20, 20, 20, 00, 20, 20, 20, 20,
         20, 20, 20, 20, 20, 20, 00, 20, 20, 20, 20,
         00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00,
         00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00,
    ;

现在我需要将所有层向下移动 1,但所有行都需要保持不变。底部的层需要删除,顶部的层需要创建一个所有值都为 0 的新层。结果应如下所示:

values = new int[11, 11] 
     00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00,
     00, 00, 00, 00, 00, 20, 20, 20, 20, 20, 20,
     00, 20, 20, 20, 00, 20, 20, 20, 20, 20, 20,
     00, 00, 20, 20, 00, 20, 20, 20, 20, 20, 20,
     20, 20, 20, 20, 00, 00, 00, 00, 00, 00, 20,
     20, 20, 20, 20, 20, 20, 20, 20, 20, 00, 20,
     20, 20, 20, 20, 20, 20, 20, 20, 20, 00, 20,
     20, 20, 20, 20, 20, 20, 00, 00, 00, 00, 20,
     20, 20, 20, 20, 20, 20, 00, 20, 20, 20, 20,
     20, 20, 20, 20, 20, 20, 00, 20, 20, 20, 20,
     00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00,
;

我尝试使用 for 循环编写一个函数来执行此操作。但没有成功。这是一种尝试:

for(int row = 11; row > 0; row--) 
    for(int col = 0; col < 11; col++) 
        targets[row, col] = targets[row + 1, col]; 
    

不幸的是,这是我唯一的尝试。 谁能帮我做这个或者有一个完成的功能来做这个?

感谢您的时间和帮助。

【问题讨论】:

您能否分享您编写的代码,以及如何没有成功? 【参考方案1】:

只需使用Array.Copy,它将与多维数组的连续内存一起使用

从指定的数组中复制一系列元素 源索引并将它们粘贴到另一个数组,从 指定的目标索引。指定长度和索引 作为 64 位整数。

Array.Copy(values,0, values,1, values.GetLength(0)* values.GetLength(1)-1);

Full Demo Here

更新

对不起,我用错了词。层需要向下移动一个 但行必须保持不变。

然后,你只需要做数学题

Array.Copy(values,0, values, values.GetLength(0)+1, values.GetLength(0) * values.GetLength(1) -values.GetLength(0)-1);

// Zero out the first row
Array.Copy(new int[values.GetLength(0)+1,1],0,values , 0,values.GetLength(0)+1);

Full Demo Here

【讨论】:

对不起,我用错了词。层需要向下移动一个,但行必须保持不变。

以上是关于在 C# 中移动二维数组的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中有效地缩小二维数组

C# 中锯齿状数组的内存分配与 C++ 中的二维数组内存分配

返回一个二维数组(在 C# 和 C++ 中)

C# CS结构中 2005 如何将二维数组转化成DataSet

为啥在 C# 中的二维数组中按列写入速度很慢

在 C# 中保存二维数组的快速方法