web-dev-qa-db-fra.com

Tableau multidimensionnel [] [] vs []

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

Quelle est leur différence? (1) donne une erreur, quelle est la raison?

Et

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

utiliser (2) provoquera une erreur. Pourquoi?

410
william007

L'un est un tableau de tableaux, et l'autre est un tableau 2D. Le premier peut être déchiqueté, le dernier est uniforme.

C'est-à-dire qu'un double[][] peut valablement être:

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

Parce que chaque entrée du tableau est une référence à un tableau de double. Avec un tableau dentelé, vous pouvez assigner un tableau comme vous le souhaitez dans votre deuxième exemple:

x[0] = new double[13];

Sur le deuxième élément, étant donné qu'il s'agit d'un tableau 2D uniforme, vous ne pouvez pas affecter un tableau 1d à une ligne ou à une colonne, car vous devez indexer la ligne et la colonne, ce qui vous ramène à un seul double:

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

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

UPDATE:

Pour clarifier basé sur votre question, la raison pour laquelle votre # 1 avait une erreur de syntaxe est parce que vous aviez ceci:

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

Et vous ne pouvez pas spécifier le deuxième index au moment de la construction. La clé est que ServicePoint n'est pas un tableau 2d, mais un tableau 1d (de tableaux) et donc puisque vous créez un tableau 1d (de tableaux) , vous ne spécifiez qu'un seul index:

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

Ensuite, lorsque vous créez chaque élément du tableau, chacun d’eux est également un tableau. Ainsi, puis vous pouvez spécifier leurs dimensions (qui peuvent être différentes, donc: le terme en dents de scie tableau):

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

J'espère que ça t'as aidé!

453
James Michael Hare

Dans le premier cas, vous essayez de créer ce qu'on appelle un tableau dentelé.

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

La déclaration ci-dessus aurait fonctionné si elle avait été définie comme ci-dessous.

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

cela signifie que vous créez un tableau de taille 10 pouvant stocker 10 tableaux de tailles différentes. En termes simples, un tableau de tableaux.voyez l'image ci-dessous, qui correspond à un tableau irrégulier.

enter image description here

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

Le second est fondamentalement un tableau à deux dimensions et la syntaxe est correcte et acceptable.

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

Et pour accéder à un tableau à deux dimensions ou le modifier, vous devez transmettre les deux dimensions, mais dans votre cas, vous ne passez qu’une seule dimension, c’est pourquoi l’erreur

Une utilisation correcte serait

ServicePoint[0][2], Fait référence à un élément de la première ligne, troisième colonne.

Représentation graphique de votre tableau à deux dimensions

enter image description here

210
Prabhu Murthy

double[][] sont appelés tableaux en escalier , Les dimensions intérieures ne sont pas spécifiées dans la déclaration. Contrairement à tableau rectangulaire , chaque tableau intérieur peut avoir une longueur arbitraire. Chaque tableau interne est implicitement initialisé sur null plutôt que sur un tableau vide. Chaque tableau interne doit être créé manuellement: Référence [C # 4.0 en bref La référence définitive]

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[,] sont appelés rectangular arrays, et sont déclarés à l'aide de virgules pour séparer chaque dimension. Le code suivant déclare un tableau bidimensionnel rectangulaire de 3 sur 3, en l'initialisant avec des nombres de 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;
58
Adil

double[,] est un tableau 2d (matrice) alors que double[][] est un tableau de tableaux ( tableaux irréguliers ) et la syntaxe est la suivante:

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

double[][] est un tableau de tableaux et double[,] est une matrice. Si vous souhaitez initialiser un tableau de tableau, vous devrez procéder comme suit:

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

Tenez compte du fait qu’utiliser des tableaux de tableaux vous permettra d’avoir des tableaux de différentes longueurs:

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