489
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)を使用すると、エラーが発生します。なんで?

4

5 に答える 5

541

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];

お役に立てば幸いです。

于 2012-09-24T14:44:16.083 に答える
235

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

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次元配列の絵画的表現

ここに画像の説明を入力してください

于 2012-09-24T14:53:54.580 に答える
68

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;
于 2012-09-24T14:45:29.687 に答える
23

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

double[][] ServicePoint = new double[10][];
于 2012-09-24T14:45:37.727 に答える
9

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...
于 2012-09-24T14:49:24.063 に答える