126 votes

Pourquoi avons-nous à la fois des tableaux en dents de scie et des tableaux multidimensionnels ?

  1. 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 ?

  2. 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];
  3. 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;

142voto

thecoop Points 23695
  1. Un tableau en dents de scie est un tableau de tableaux. int[][] est un tableau de int[] 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).

  2. 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.

  3. 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.

49voto

Anthony Pegram Points 58528

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

13voto

Frederik Gheysels Points 36354

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.

6voto

nan Points 4412

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

2voto

Muhammad Junaid Points 41

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.

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