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)を使用すると、エラーが発生します。なんで?
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次元配列です。前者はギザギザにすることができ、後者は均一です。
つまり、adouble[][]
は有効に次のようになります。
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番目の項目では、均一な2D配列であるため、1D配列を行または列に割り当てることはできません。これは、行と列の両方にインデックスを付ける必要があるためです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が2d配列ではなく、(配列の)1d配列であるため、(配列の)1d配列を作成しているため、インデックスを1つだけ指定することです。
double[][] ServicePoint = new double[10][];
次に、配列内の各アイテムを作成するときに、それらのそれぞれも配列であるため、それらの次元を指定できます(異なる場合があるため、ジャグ配列という用語が使用されます)。
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/en-us/library/2s05feca(v=vs.80).aspx
2つ目は、基本的に2次元配列であり、構文は正しく、受け入れ可能です。
double[,] ServicePoint = new double[10,9];//<-ok (2)
また、2次元配列にアクセスまたは変更するには、両方の次元を渡す必要がありますが、この場合は1つの次元のみを渡すため、エラーが発生します。
正しい使い方は
ServicePoint[0][2]
、1行3列目の項目を指します。
2次元配列の絵画的表現
double[][]
ジャグ配列と呼ばれます。内部の次元は宣言で指定されていません。長方形の配列とは異なり、各内部配列は任意の長さにすることができます。各内部配列は、空の配列ではなく、暗黙的にnullに初期化されます。各内部配列は手動で作成する必要があります。リファレンス[一言で言えば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...