【发布时间】:2021-11-16 00:50:03
【问题描述】:
我目前遇到零填充二维数组的问题。我想将我的数组中的当前数据传输到一个新数组,该数组是完全相同的数组,但它周围的边框为 0。 示例:
|1 2 3|
|4 5 6|
|7 8 9|
应该变成
|0 0 0 0 0|
|0 1 2 3 0|
|0 4 5 6 0|
|0 7 8 9 0|
|0 0 0 0 0|
int[,] Array = new int[,] { { 1, 2, 3 }, { 3, 4, 5 }, { 6, 7, 8 } };
int[,] ArrayZeroPad = new int[Array.GetLength(0) + 2, Array.GetLength(1) + 2];
for (int y = 0; y < Array.GetLength(1); y++)
{
for (int x = 0; x < ArrayZeroPad.GetLength(0); x++)
{
if (y == 0)
{ ArrayZeroPad[y, x] = 0; }
else if (y == ArrayZeroPad.GetLength(1))
{ ArrayZeroPad[y, x] = 0; }
else if (x == 0)
{
ArrayZeroPad[y, x] = 0;
}
else if (x == ArrayZeroPad.GetLength(0))
{ ArrayZeroPad[y, x] = 0; }
else ArrayZeroPad[y, x] = Array[y, x];
}
}
for (int y = 0; y < ArrayZeroPad.GetLength(1); y++)
{
Console.WriteLine();
for (int x = 0; x < ArrayZeroPad.GetLength(0); x++)
{ Console.Write(ArrayZeroPad[y, x]); }
Console.ReadLine();
}
}
这是我到目前为止所遇到的,但我一直卡在超出范围的错误中,有没有人可以通过一些解释为我解决这个问题?
亲切的问候, D.
【问题讨论】:
-
您应该能够将循环范围更改为您的填充长度,并存档良好的结果。考虑使用
for(int y = paddingSize; y < ArrayZeroPad.GetLength(1) - paddingSize; y++) -
如果你想有创意,你可以在不复制的情况下做到这一点。只需获取一个类,它传递了一个 T 数组并具有一个
public T this [int][int]实现,使其看起来像一个数组 X+2 乘 Y+2,它一直都有零(默认值) -
在内部循环的最后一行中,您试图访问
Array范围之外的内存。ArrayZeroPad的尺寸比Array的尺寸长,但您的索引长度达到了ArrayZeroPad的尺寸。当x或y的值大于Array的维度长度时,您超出了范围。
标签: c# arrays padding zero-padding