-
Quelle est la différence entre un tableau en dents de scie et un tableau multidimensionnel ? Y a-t-il un avantage de l'un par rapport à l'autre ?
-
Et pourquoi Visual Studio ne me permet-il pas de faire un
MyClass[][] abc = new MyClass[10][20];
(Nous avions l'habitude de faire cela en C++, mais en C#, il souligne [20] d'une ligne rouge ondulée. Dit que le spécificateur de rang n'est pas valide)
mais se contente de
MyClass[,] abc = new MyClass[10,20];
-
Enfin, comment puis-je initialiser ceci en une seule ligne (comme nous le faisons dans un simple tableau avec
{new xxx...}{new xxx....}
)MyClass[][,][,] itemscollection;
Réponses
Trop de publicités?-
Un tableau en dents de scie est un tableau de tableaux.
int[][]
est un tableau deint[]
qui peuvent être de longueurs différentes et occuper leur propre bloc de mémoire. Un tableau multidimensionnel (int[,]
) est un bloc de mémoire unique (essentiellement une matrice). -
Vous ne pouvez pas créer un
MyClass[10][20]
car chaque sous-réseau doit être initialisé séparément, puisqu'il s'agit d'objets distincts :MyClass[][] abc = new MyClass[10][]; for (int i=0; i<abc.Length; i++) { abc[i] = new MyClass[20]; }
A
MyClass[10,20]
est correct, car il initialise un objet unique sous la forme d'une matrice de 10 lignes et 20 colonnes. -
A
MyClass[][,][,]
peut être initialisé de la manière suivante (non testé à la compilation) :MyClass[][,][,] abc = new MyClass[10][,][,]; for (int i=0; i<abc.Length; i++) { abc[i] = new MyClass[20,30][,]; for (int j=0; j<abc[i].GetLength(0); j++) { for (int k=0; k<abc[i].GetLength(1); k++) { abc[i][j,k] = new MyClass[40,50]; } } }
Gardez à l'esprit que le CLR est fortement optimisé pour l'accès aux tableaux unidimensionnels, de sorte que l'utilisation d'un tableau en dents de scie sera probablement plus rapide que celle d'un tableau multidimensionnel de même taille.
Un tableau en dents de scie est un tableau de tableaux. Il n'est pas garanti que chaque tableau ait la même taille. Vous pourriez avoir
int[][] jaggedArray = new int[5][];
jaggedArray[0] = new[] {1, 2, 3}; // 3 item array
jaggedArray[1] = new int[10]; // 10 item array
// etc.
Il s'agit d'un fixer de tableaux apparentés.
Un tableau multidimensionnel, en revanche, est davantage un groupe cohérent, comme une boîte, une table, un cube, etc., où il n'y a pas de longueurs irrégulières. Il n'y a pas de longueurs irrégulières.
int i = array[1,10];
int j = array[2,10]; // 10 will be available at 2 if available at 1
Un tableau rectangulaire comporte toujours le même nombre de colonnes pour chaque ligne.
MyClass[,] x = new MyClass[10,30]
Chaque ligne comporte 30 colonnes, alors que dans un tableau en dents de scie, cela n'est pas nécessaire. Par conséquent, je pense que vous devrez initialiser chaque "ligne" d'un tableau en dents de scie séparément :
MyClass[][] x = new MyClass[10][];
for(int i = 0; i < 10; i++)
{
x[i] = new MyClass[30];
}
En fait, cela signifie que chaque ligne du tableau irrégulier ne doit pas contenir le même nombre d'éléments. (Dans mon exemple, elle contient le même nombre d'éléments, mais ce n'est pas obligatoire).
Vous pouvez parfaitement le faire, par exemple :
MyClass[][] x = new MyClass[10][];
for(int i = 0; i < 10; i++)
{
x[i] = new MyClass[(30 + i)];
}
Este pourrait être un article intéressant pour vous.
Ad 3) Pour initialiser un tel monstre comme [][,][,]
vous pouvez faire quelque chose comme :
int [,][,] multiArr1 = { { new int[,] { { 2, 2 }, { 1, 1 } },
new int[,] { { 2, 2 }, { 1, 1 } } },
{ new int[,] { { 2, 2 }, { 1, 1 } },
new int[,] { { 2, 2 }, { 1, 1 } } } };
int [,][,] multiArr2 = { { new int[,] { { 2, 2 }, { 1, 1 } },
new int[,] { { 2, 2 }, { 1, 1 } } },
{ new int[,] { { 2, 2 }, { 1, 1 } },
new int[,] { { 2, 2 }, { 1, 1 } } } };
int [][,][,] superMultiArray = { multiArr1, multiArr2 };
Un tableau multidimensionnel est un tableau rectangulaire en C#. Il ne peut avoir qu'un nombre fixe d'éléments dans chaque dimension. L'exemple de code suivant nous montre comment déclarer un tableau multidimensionnel en C#.
int[,] multiArray = new[3,3]
Un tableau en dents de scie est un tableau de tableaux en C#. Il peut contenir des tableaux de tailles différentes. L'exemple de code suivant nous montre comment déclarer un jagged array en C#.
int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int [1];
jaggedArray[1] = new int[2];
jaggedArray[2] = new int[3];
Dans le code ci-dessus, nous avons créé le tableau jaggedArray de taille 3, ce qui signifie que le tableau jaggedArray est un tableau de 3 tableaux. Ces 3 tableaux se trouvent aux indices 0, 1 et 2 du jaggedArray. L'exemple montre clairement que tous ces tableaux sont de tailles différentes.
Les tableaux en dents de scie doivent être préférés aux tableaux multidimensionnels conventionnels en raison de leur flexibilité en C#. Par exemple, si nous devons stocker les hobbies d'une personne, l'approche préférée serait d'utiliser un tableau en dents de scie parce que tout le monde n'a pas le même nombre de hobbies. Il en va de même pour les centres d'intérêt et bien d'autres choses.
- Réponses précédentes
- Plus de réponses