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) を使用するとエラーが発生します。どうして?
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];
それが役立つことを願っています!
最初の例では、ギザギザ配列と呼ばれるものを作成しようとしています。
double[][] ServicePoint = new double[10][9].
上記のステートメントは、以下のように定義されていれば機能します。
double[][] ServicePoint = new double[10][]
これが意味するのは、10個の異なるサイズの配列をその中に格納できるサイズ10の配列を作成しているということです。簡単に言うと、配列の配列です。下の画像を見てください。
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列目の項目を参照します。
あなたの二次元配列の絵画担当者
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;
double[,]
は2次元配列(行列)、double[][]
は配列の配列( ギザギザ配列 )で、構文は次のとおりです。
double[][] ServicePoint = new double[10][];
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...