web-dev-qa-db-fra.com

Pourquoi avons-nous à la fois un tableau dentelé et un tableau multidimensionnel?

  1. Quelle est la différence entre un tableau dentelé et un tableau multidimensionnel . Y a-t-il un avantage de l'un sur l'autre?

  2. Et pourquoi Visual Studio ne me permettrait-il pas de faire une 

    MyClass[][] abc = new MyClass[10][20];
    

    (Nous avions l'habitude de faire cela en C++, mais en C #, il souligne [20] avec une ligne rouge ondulée. Indique un spécificateur de rang invalide)

    mais est heureux avec 

    MyClass[,] abc = new MyClass[10,20];
    
  3. Enfin, comment puis-je initialiser cela sur une seule ligne (comme dans un tableau simple avec {new xxx...}{new xxx....})

    MyClass[][,][,] itemscollection;
    
56
Shekhar_Pro
  1. Un tableau dentelé est un tableau de tableaux, donc un int[][] est un tableau de int[], chacun pouvant être de longueur différente et occuper son propre bloc en mémoire. Un tableau multidimensionnel (int[,]) est un seul bloc de mémoire (essentiellement une matrice).

  2. Vous ne pouvez pas créer un MyClass[10][20] car chaque sous-tableau doit être initialisé séparément, car il s'agit d'objets distincts:

    MyClass[][] abc = new MyClass[10][];
    
    for (int i=0; i<abc.Length; i++) {
        abc[i] = new MyClass[20];
    }
    

    un MyClass[10,20] est correct car il initialise un seul objet sous forme de matrice à 10 lignes et 20 colonnes

  3. Un MyClass[][,][,] peut être initialisé comme suit (non compilé testé):

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

N'oubliez pas que le CLR est fortement optimisé pour l'accès à un tableau à une dimension. Par conséquent, l'utilisation d'un tableau en escalier sera probablement plus rapide qu'un tableau multidimensionnel de la même taille.

68
thecoop

Un tableau dentelé est un tableau de tableaux. Il n’est pas garanti que chaque tableau a la même taille. Tu aurais pu 

int[][] jaggedArray = new int[5][];
jaggedArray[0] = { 1, 2, 3 }; // 3 item array
jaggedArray[1] = new int[10]; // 10 item array
// etc.

C'est un set de tableaux associés.

En revanche, un tableau multidimensionnel est plus un groupe cohérent, comme une boîte, une table, un cube, etc. C'est-à-dire

int i = array[1,10];
int j = array[2,10]; // 10 will be available at 2 if available at 1
29
Anthony Pegram

Un tableau rectangulaire a toujours le même nombre de colonnes pour chaque ligne.

MyClass[,] x = new MyClass[10,30]

Chaque ligne contient 30 colonnes, alors que dans un tableau irrégulier, ceci n'est pas obligatoire . Par conséquent, je pense que vous devrez initialiser chaque 'ligne' dans un tableau séparé 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 toutes les lignes du tableau en escalier ne doivent pas nécessairement contenir le même nombre d'éléments. (Dans mon exemple, le nombre d'éléments est le même, mais ce n'est pas obligatoire).

Vous pouvez parfaitement faire cela, par exemple:

MyClass[][] x = new MyClass[10][];

for(int i = 0; i < 10; i++)
{
    x[i] = new MyClass[(30 + i)];
}

Ceci pourrait être un article intéressant pour vous.

7
Frederik Gheysels

Ad 3) Pour initialiser un tel monstre comme [][,][,], vous pouvez le faire comme ceci:

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

Si vous recherchez un tableau multidimensionnel comportant des limites, utilisez toujours la syntaxe de style [,]. Cela fera en sorte que chaque partie est de taille égale.

Lorsque vous utilisez [][], vous créez réellement un tableau de tableaux. Cela signifie alors que chaque tableau peut être dimensionné différemment. Par exemple:

int[][] jaggedArray = new int[5][]
for(int index = 0; index < jaggedArray.Length ; ++index)
{
    jaggedArray[index] = new int[index + 1];
}
1
Joshua Rodgers

La déclaration en ligne ressemblerait à quelque chose comme ceci:

int[,] numbers = { {1, 2}, {3, 4}, {5, 6} };
1
Josiah Ruddell

Pour # 1, voir cette SO question

Pour les tableaux en ligne déchiquetés ou multidimensionnels, consultez ce guide de programmation :

// Three-dimensional array.
int[, ,] array3D = new int[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } };
// Same array with dimensions specified.
int[, ,] array3Da = new int[2, 2, 3] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } };

Vous n'avez pas à spécifier les dimensions (array3D), mais si vous savez qu'elles ne changeront jamais, il est utile de savoir quelles dimensions vous utilisez (array3Da).

1
rownage

Vous devez comprendre le fonctionnement interne du tableau Le tableau multidimensionnel agit comme un tableau à une seule dimension, sauf que la double indexation est convertie en un seul.

Votre tableau Jagged en c # est un tableau d'objets qui sont des tableaux à tour de rôle.

0
dvhh

Je pense que l'allocation de mémoire des tableaux 2d en escalier en C # est semblable à celle des tableaux 2d en C++ et C . ) comme ce code en C++,

int** 2DArr {new int* [number1]};
for (int i = 0; i < number1; i++)
{
   2DArr[i] = new int[number2];
}

l'allocation de mémoire du code ci-dessous est identique à celle de tableaux bidimensionnels en C #. Mais je doute, pourriez-vous s'il vous plaît expliquer plus si je pense de la mauvaise façon.

0
A.salehy

Cet article est vieux, mais voici ce que je pense de cela.

Les tableaux déchiquetés sont des tableaux multidimensionnels. Il existe deux types de tableaux multidimensionnels: rectangulaire et déchiqueté. Les tableaux rectangulaires représentent un bloc de mémoire à n dimensions, et les tableaux en dents de scie sont des tableaux de tableaux.

Tableaux rectangulaires

Les tableaux rectangulaires sont déclarés en utilisant des virgules pour séparer chaque dimension. L'instruction suivante déclare un tableau rectangulaire à deux dimensions, dont les dimensions sont 3 × 3:

int[,] matrix = new int [3, 3]; 

Tableaux dentelés

Les tableaux en dents de scie sont déclarés à l'aide de crochets successifs pour représenter chaque dimension. Voici un exemple de déclaration d'un tableau bidimensionnel en dents de scie, où la dimension la plus externe est 3:

int[][] matrix = new int[3][];
0
Imir Hoxha