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

Posted

技术标签:

【中文标题】在 C# 中有效地缩小二维数组【英文标题】:Efficiently shrinking a two dimensional array in C# 【发布时间】:2010-09-16 01:22:56 【问题描述】:

在 C# 中将二维数组缩小为更小尺寸的有效方法是什么?

例如:

var bigArray = new object[100, 100];
var smallArray = new object[10, 10];

bigArray[0, 0] = 1;
bigArray[0, 1] = 2;
...
bigArray[99, 99] = 100000;


startRowIndex = 0;
startColumnIndex = 0;
endRowIndex = 9;
endColumnIndex = 9;

smallArray = bigArray.SomeShirnkingMethod(startRowIndex, startColumnIndex, endRowIndex, endColumnIndex);

你将如何编写 SomeShrinkingMethod() ?

谢谢!

编辑:我只是想将 bigArray 的前 10 行和前 10 列放入 smallArray,但我不确定循环遍历数组是否是最有效的方法。

【问题讨论】:

【参考方案1】:

您必须创建一个所需大小的新数组(在您的代码中,您已经这样做了)并复制内容。我不确定在您的情况下“缩小”操作需要做什么。但是,您不能修改现有数组的维度。

您提出的函数有缺陷,因为它无法知道目标数组的维度。要么在内部传递新数组的维度和维度,要么将目标数组传递给它并简单地复制内容。

编辑:

回应您的编辑:是的,循环将是执行此操作的合理方式,而且速度也相当快。我不知道 .NET 中可以应用于多维数组的块复制机制。

【讨论】:

感谢您的回复。请查看编辑后的示例。我只是想将前 10x10 个对象从 bigArray 复制到 smallArray。我只是不确定是否有比运行嵌套 for 循环更有效的方法。谢谢! for 循环会做你想做的事,而不会产生很多不必要的开销。如果你所做的只是复制,那就是要走的路。【参考方案2】:

取决于您希望收缩功能做什么。您必须创建一个新数组并根据您的标准进行复制。我的假设是你有一个二维数组是有原因的,对吧?副本可以是琐事(找到具有非零值的下一个位置并将其放在目标中的下一个可用位置)或基于其他内容。你能提供更多信息吗?

【讨论】:

【参考方案3】:

是的,最好的方法几乎可以肯定是循环遍历每个单元格,尽管可以复制每个“行”的序列。该方法需要知道要从源方格复制的方格的较低索引,以及大小(可能在目标方格定义中隐含)。

【讨论】:

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

Numpy:使用字典作为地图有效地替换二维数组中的值

稀疏数组

C#二维数组验证表单中的条目

(24)C#二维数组,排序功能,使用ArrayList类,checked语句,finally语句

稀疏数组

稀疏数组