424 votes

tableau multidimensionnel [] [] vs [,]

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

Quel est leur différent? (1) me donne une erreur, quelle est la raison?

Et

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

en utilisant (2) me demandera une erreur, quelle est la raison?

464voto

James Michael Hare Points 19077

L'un est un tableau de tableaux, et on est un tableau 2d. Les premières peuvent être irréguliers, ce dernier est uniforme.

C'est, 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 dans le tableau est une référence à un tableau d' double. Avec un tableau en escalier, vous pouvez faire une cession à un tableau comme vous le souhaitez dans votre deuxième exemple:

x[0] = new double[13];

Sur le deuxième point, parce que c'est un uniforme tableau 2d, vous ne pouvez pas affecter un 1d tableau à une ligne ou une colonne, car vous devez l'indice de la ligne et de la colonne, qui descend jusqu'à un seul double:

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

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

Mise à JOUR:

À préciser en fonction de votre question, la raison n ° 1 avait une erreur de syntaxe est parce que vous avez eu ce:

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

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

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

Ensuite, lorsque vous créez chaque élément d'un tableau, chacun de ceux-ci sont aussi des tableaux, donc ensuite, vous pouvez spécifier leurs dimensions (qui peut être différente, d'où le terme de jagged tableau):

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

Espérons que ça aide!

213voto

unikorn Points 3986

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

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

La déclaration ci-dessus aurait travaillé s'il a été défini comme ci-dessous.

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

ce que cela signifie est que vous êtes la création d'un tableau de taille 10 ,qui peut stocker que de 10 différentes tailles de tableaux à l'intérieur.En termes simples, un Tableau de tableaux.voir l'image ci-dessous,ce qui signifie un tableau en escalier.

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 ou modifier un tableau à deux dimensions, vous devez passer à la fois les dimensions,mais dans votre cas, vous êtes de passage à une seule dimension,c'est pourquoi l'erreur

L'utilisation correcte serait

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

Picturale représentant de votre tableau à deux dimensions

enter image description here

58voto

Adil Points 80031

double[][] sont appelés les tableaux irréguliers , Les dimensions intérieures ne sont pas spécifiées dans la déclaration. Contrairement à un tableau rectangulaire, chaque interne tableau peut être d'une longueur arbitraire. Chaque interne tableau est implicitement initialisé à null plutôt que d'un tableau vide. Chaque interne tableau doit être créé manuellement: la 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 sont déclarées à l'aide des virgules pour séparer chaque dimension. L'exemple suivant déclare une rectangulaire tableau à deux dimensions, où les dimensions sont de 3 par 3: int [,] de la matrice = 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;

19voto

Fuex Points 6246

double[,] est un tableau 2d (matrice) tandis que double[][] est un tableau de tableaux ( tableaux en dents de scie ) et la syntaxe est:

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

8voto

ivowiblo Points 5455

double[][] est un tableau de tableaux et double[,] est une matrice. Si vous voulez initialiser un tableau de tableau, vous devrez faire ceci:

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

Prenez en compte que l'utilisation de 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...
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X