2

ボックスとして使用している多次元配列があり、次のように、その周りに境界線を生成するコードがあります。

#######
#     #
#     #
#     #
#     #
#######

しかし、私が理解していないのは、「j == ProcArea.GetUpperBound(...)」の部分に 0 または 1 を指定でき、エラーや予期しない出力なしで正常に動作することです。

            int[,] ProcArea = new int[rows, columns];
            //Generate border
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < columns; j++)
                {
                    if (i == 0 || j == 0 || i == ProcArea.GetUpperBound(0) || j == ProcArea.GetUpperBound(1))
                    {
                        ProcArea[i, j] = 2;

                    }
                }
            }

なぜこれが機能するのですか?また、使用すべき正しい値は何ですか?

ありがとう

4

2 に答える 2

2

行数と列数が同じ場合、GetUpperBound(0)GetUpperBound(1)は同じ値を返します。

C# で作成した配列は (直接呼び出さない限りArray.CreateInstance) 常に 0 ベースです。だから、GetUpperBound(0)常に戻りrows - 1GetUpperBound(1)常に戻りcolumns - 1ます。

したがって、チェックする上限に関係なく、コードは「機能」しますが、 ifrows != columnsを使用GetUpperBound(0)すると、 とは異なるサイズのボックスが作成されることがわかると思いますGetUpperBound(1)

ちなみに、境界線を作成する別の方法は次のとおりです。

var maxRow = ProcArea.GetUpperBound(0);
var maxCol = ProcArea.GetUpperBound(1);
// do top and bottom
for (int col = 0; col <= maxCol; ++col)
{
    ProcArea[0, col] = 2;
    ProcArea[maxRow, col] = 2;
}
// do left and right
for (int row = 0; row <= maxRow; ++row)
{
    ProcArea[row, 0] = 2;
    ProcArea[row, maxCol] = 2;
}

少しコードが増えますが、不必要にインデックスをチェックして時間を無駄にすることはありません。もちろん、小さな配列では違いはありません。

于 2013-07-26T15:09:58.907 に答える
1

ドキュメントhttp://msdn.microsoft.com/en-us/library/system.array.getupperbound.aspxを確認してください。配列には 2 つの次元 (行と列) があります。

ProcArea.GetUpperBound(0)と同等ですrows - 1

ProcArea.GetUpperBound(1)と同等ですcolumns - 1

于 2013-07-26T15:06:30.730 に答える