web-dev-qa-db-ja.com

C#で2次元配列の配列を作成する

座標点を格納するために、2次元配列の配列を作成したいだけです。

したがって、各インデックスがxおよびyとして使用する2次元配列を返す配列が必要です。

これが私が試したことです:

waypoints = new int[4][,]    {
        {{0},{6, 0}},
        {{1},{1, 1}},
        {{2},{1, 5}},
        {{3},{6, 5}}
    };

これはおそらくばかげているように見えると思いますが、Googleで調べてみましたが、良い結果は得られませんでした。

エラーが発生します:

「エラーCS0623:配列初期化子は変数またはフィールド初期化子でのみ使用できます。代わりに新しい式を使用してみてください」

私もこのようにしてみました:

waypoints = new int[4][,] {
        new int[,] {6, 0},
        new int[,] {1, 1},
        new int[,] {1, 5},
        new int[,] {6, 5}
        };

これによりエラーが発生します:

「エラーCS0846:ネストされた配列初期化子が必要でした」

14
MysticPing

最初の宣言には、もう1つの中括弧セット{}が必要です。

var waypoints = new int[4][,]   {
    new int[,] {{6}, {0}},
    new int[,] {{1}, {1}},
    new int[,] {{1}, {5}},
    new int[,] {{6}, {5}}
};

これは、このような2D配列の場合、配列内の各要素が初期化用の配列と見なされるためです(ただし、通常はval[0,0] = 4;などの配列の要素ごとに使用されます)。

編集(コメントからのフィードバック後):

int[][]jagged arrayとして知られています。つまり、配列メンバーが 異なるサイズ である配列の配列)とは対照的に、int[,]は2D配列です。 固定寸法 。どちらも配列を格納する配列であるため、配列の各要素は配列です。これは、上記のように初期化に別の中括弧を入れる必要がある理由を説明しています。

このような2D配列は、異なる方法で初期化すると、異なる次元になります(したがって、初期化する方法は複数あります)。

int[,] val = new int[,] { { 6 }, { 0 } }; //resulting in int[2,1]
int[,] val = new int[,] { { 6, 0 } }; //resulting in int[1,2]

いずれにせよ、中括弧の追加セットが必要です

jagged arrayと多次元の固定サイズの配列の違いについては、 ありすでにたっぷり良い説明/ベンチマーク利用可能オンライン 評判の良い情報源から。そして、OPの関心を除けば、それについてもっと情報を提供することは重要ではないことを理解しています。 (したがって、この回答の範囲は元々、失敗した初期化に回答することのみを目的としています)。

このソリューションは、座標点の保存には最適ではないことが理解されています(OPによって行われるように)。上記の説明は、座標点を格納するための最良のソリューションを提供するためではなく、彼の初期化が機能しない理由を説明するために提供されています。座標点の格納に関しては、 PointSystem.Drawingstructの方が適切です(コメントで示唆されているように)。

2D配列を使用して2Dで単一の点を表す デカルト座標 1D配列はすでにコンピューターが許可する数の数値を格納できるため、「やり過ぎ」です。デカルト座標系でポイントを格納します。

11
Ian

これには簡単な答えがあります。 「System.Drawing.Point」クラスのインスタンスを使用します。座標を格納する「ポイント」配列を作成します。アレイを作成するには:

Point[] points = new Point[4];

また、配列に値を割り当てるには(たとえば、位置0)、次のコードを使用します。

points[0] = new Point(xvalue,yvalue);//Where "xvalue" and "yvalue" are integer variables.

そして、ポイントクラスのインスタンスからX値とY値を取得します。以下のコードを使用してください。

int xvalue = points[0].X;

int yvalue = points[0].Y;

P.S.これらのポイントを使用して場所をコントロールに割り当てることができますが、それは別の話です^ _ ^

12
Robbie Coyne

配列は2次元であり、サイズは不明です。初期化子はさまざまなサイズの配列を定義できます。

        var waypoints = new int[4][,]   {
                new int[,] { {1, 2, 6}, {3, 4, 5} }, // two rows, 3 columns
                new int[,] { {1, 1}, {1, 2} } , // 2 x 2
                new int[,] { {1, 5} }, // 1 x 2
                new int[,] { {6, 5} }
                };
2
Martin Staufcik

質問を誤解しているかもしれませんが、配列の次元を超えすぎていませんか?これは、PointクラスまたはVectorクラスの使用を提案している人たちと同じような見方です。各配列が1つのポイントのみを格納している場合(そうでない場合もありますが、私はそれを想定しているだけかもしれません)、3次元は必要ありません。通常の配列の配列を作成し、x座標にインデックス0を使用し、y座標にインデックス1を使用することができます。

各配列のサイズが1である3次元全体を作成しているように見えます。これは、2次元配列として視覚化する方がはるかに簡単です。配列を一種のキーと値のペアとして使用しているように見えますが、インデックス自体をキーとして使用できますか?とにかく毎回増えているようです。

0
Ty Brantner