web-dev-qa-db-ja.com

多次元配列[] [] vs [、]

double[][] ServicePoint = new double[10][9]; // <-- gives an error (1)
double[,] ServicePoint = new double[10,9]; // <-- ok (2)

彼らの違いは何ですか? (1) はエラーになりますが、その理由は何ですか?

そして

double d = new double[9]
ServicePoint[0] = d;

(2) を使用するとエラーが発生します。どうして?

401
william007

1つは配列の配列、もう1つは2次元配列です。前者はぎざぎざすることができます、後者は均一です。

つまり、double[][]は有効に次のようになります。

double[][] x = new double[5][];

x[0] = new double[10];
x[1] = new double[5];
x[2] = new double[3];
x[3] = new double[100];
x[4] = new double[1];

配列の各エントリはdoubleの配列への参照であるためです。ギザギザ配列を使えば、2番目の例のように配列に代入することができます。

x[0] = new double[13];

2番目の項目では、一様な2次元配列なので、1次元配列を行または列に割り当てることはできません。行と列の両方にインデックスを付ける必要があるため、単一のdoubleになります。

double[,] ServicePoint = new double[10,9];

ServicePoint[0]... // <-- meaningless, a 2d array can't use just one index.

_更新_

あなたの質問に基づいて明確にするために、あなたの#1が構文エラーを持っていた理由はあなたがこれを持っていたからです:

double[][] ServicePoint = new double[10][9];

また、構築時に2番目のインデックスを指定することはできません。重要なのは、ServicePointはnot 2 dの配列ですが、1 dの(配列の)配列なので、1つの(配列の)配列を作成しているので、インデックスを1つだけ指定することです。

double[][] ServicePoint = new double[10][];

次に、配列内の各項目を作成すると、それらもそれぞれ配列です。したがって、thenを使用して次元を指定できます(これは異なる場合があるため、jagged arrayという用語)。

ServicePoint[0] = new double[13];
ServicePoint[1] = new double[20];

それが役立つことを願っています!

440

最初の例では、ギザギザ配列と呼ばれるものを作成しようとしています。

double[][] ServicePoint = new double[10][9].

上記のステートメントは、以下のように定義されていれば機能します。

double[][] ServicePoint = new double[10][]

これが意味するのは、10個の異なるサイズの配列をその中に格納できるサイズ10の配列を作成しているということです。簡単に言うと、配列の配列です。下の画像を見てください。

enter image description here

http://msdn.Microsoft.com/ja-jp/library/2s05feca(v=vs.80).aspx

2番目のものは基本的に2次元配列であり、構文は正しくて受け入れ可能です。

  double[,] ServicePoint = new double[10,9];//<-ok (2)

また、2次元配列にアクセスしたり変更したりするには、両方の次元を渡す必要がありますが、1つの次元しか渡さないため、エラーが発生します。

正しい使い方は

ServicePoint[0][2]、1行3列目の項目を参照します。

あなたの二次元配列の絵画担当者

enter image description here

206
Prabhu Murthy

double[][] ギザギザ配列 と呼ばれています。内部ディメンションは宣言で指定されていません。 長方形の配列 とは異なり、各内部配列は任意の長さにすることができます。各内部配列は、空の配列ではなく暗黙的にnullに初期化されます。 各内部配列は手動で作成する必要があります。 Reference [一言で言えばC#4.0]。

for (int i = 0; i < matrix.Length; i++)
{
    matrix[i] = new int [3]; // Create inner array
    for (int j = 0; j < matrix[i].Length; j++)
        matrix[i][j] = i * 3 + j;
}

double[,]rectangular arraysと呼ばれ、各次元を区切るためにコンマを使用して宣言されます。次のコードは、長方形の3行3列の2次元配列を宣言し、0から8までの数字で初期化します。

int [,] matrix = new int [3, 3];
for (int i = 0; i < matrix.GetLength(0); i++)
    for (int j = 0; j < matrix.GetLength(1); j++)
        matrix [i, j] = i * 3 + j;
55
Adil

double[,]は2次元配列(行列)、double[][]は配列の配列( ギザギザ配列 )で、構文は次のとおりです。

double[][] ServicePoint = new double[10][];
19
Omar

double[][]は配列の配列、double[,]は行列です。もしあなたが配列の配列を初期化したいなら、あなたはこれをする必要があるでしょう:

double[][] ServicePoint = new double[10][]
for(var i=0;i<ServicePoint.Length;i++)
    ServicePoint[i] = new double[9];

配列の配列を使用すると、長さの異なる配列を使用できるようになります。

ServicePoint[0] = new double[10];
ServicePoint[1] = new double[3];
ServicePoint[2] = new double[5];
//and so on...
8
Ivo