Les tableaux bidimensionnels sont une collection d'éléments homogènes qui s'étendent sur plusieurs lignes et colonnes, prenant la forme d'une matrice. Vous trouverez ci-dessous un exemple de tableau 2D comportant m lignes et n colonnes, créant ainsi une matrice de configuration m x n.
[ a1, a2, a3, a4, ..., an b1, b2, b3, b4, ..., bn c1, c2, c3, c4, ..., cn . . . m1, m2, m3, m4, ..., mn ]
Un tableau Jagged est un tableau de tableaux. Les tableaux irréguliers sont essentiellement plusieurs tableaux irréguliers pour former un tableau multidimensionnel. Un tableau irrégulier bidimensionnel peut ressembler à ceci :
[ [ a1, a2, a3, a4, ..., an ], [ b1, b2, b3, b4, ..., b20 ], [ c1, c2, c3, c4, ..., c30 ], . . . [ m1, m2, m3, m4, ..., m25 ] ]
Notez que toutes les lignes d'un tableau irrégulier peuvent ou non contenir le même nombre d'éléments.
Les tableaux Jagged sont complètement différents d'un véritable tableau 2D du point de vue de la mise en œuvre. Il est important de comprendre comment C# implémente à la fois les tableaux multidimensionnels et les tableaux irréguliers.
Les langages de programmation diffèrent par leur implémentation de tableaux multidimensionnels. Certains langages de programmation comme C, C++, C#, Fortran, etc. prennent en charge de véritables tableaux 2D. Bien qu'il en existe d'autres qui simulent ce comportement avec des tableaux de tableaux, c'est-à-dire des tableaux irréguliers. Alors, en quoi un véritable tableau bidimensionnel est-il différent des tableaux irréguliers ?
Les deux implémentations de tableaux multidimensionnels sont différentes en termes de consommation de stockage. Alors qu'un véritable tableau 2D aurait m lignes de n éléments chacune, un tableau irrégulier pourrait avoir m lignes ayant chacune un nombre différent d'éléments. Cela conduit à un minimum d’espace perdu pour les ensembles de données. Ainsi, le tableau ci-dessous convient parfaitement :
int[][] jagged array = [ [1, 2, 3, 4], [5, 6, 7], [8, 9] ]
Si le même ensemble de données devait être implémenté dans un véritable tableau 2D, cela aurait été comme ci-dessous :
int[,] multiDimArray = [ 1, 2, 3, 4 5, 6, 7, 0 8, 9, 0, 0 ]
Ici, quelques opérations sur les tableaux 2D données ci-dessous :
Voyons une manière de déclarer un tableau 2D en C# et une autre manière de ne pas déclarer un tableau 2D en C#.
Comment faire ?
Une véritable implémentation de tableau 2D en C# commence par la déclaration Array. Cela ressemble à ci-dessous :
int[,] arr2D; string[,] arr2D_s;
Le nombre de virgules dans la définition détermine la dimension du tableau. Notez que vous ne pouvez pas spécifier la taille du tableau dans la déclaration du tableau. Cela doit être fait lors de l'initialisation d'un tableau.
Comment ne pas le faire ?
Il est facile de confondre les implémentations de tableaux 2D et de tableaux irréguliers. Une déclaration de tableau irrégulier ressemble à ci-dessous :
int[][] jagged array;
L'étape suivante consiste à initialiser le tableau 2D que nous venons de déclarer. Il existe plusieurs façons de le faire.
Utiliser le nouvel opérateur
arr2D = new int[2,3]; //separate initialization string[,] arr2D_s = new string[4,5]; //with declaration
Initialisation avec des valeurs
//without dimensions arr2D = new int[,]{{1,2}, {3,4}, {5,6}}; //with declaration arr2D_s = new string[2,2]{{"one","two"},{"three", "four"}};
Sans le nouvel opérateur
Int[,] arr2D_a = {{1,2}, {3,4}, {5,6}, {7,8}};
Lire un seul élément
L'opération suivante consiste à lire les éléments du tableau 2D. Étant donné que le tableau 2D est une matrice de m x n éléments, chaque élément a une combinaison d'index de ligne et d'index de colonne désignée. Nous pouvons accéder aux éléments en fournissant l'index de ligne et l'index de colonne dans l'indice. Un exemple est ci-dessous :
int[,] arr2D_i = {{1,2}, {3,4}, {5,6}, {7,8}}; string arr2D_s = {{"one","two"},{"three", "four"}}; int val_i = arr2D_i[2,1]; //returns '6' string val_s = arr2D_s[1,1]; //returns 'four'
Lire tous les éléments
Mais la méthode ci-dessus nous donne la valeur d'un seul élément du tableau. Comment parcourir l’ensemble du tableau pour en lire chacun de ses éléments ? La solution simple consiste à parcourir l'ensemble du tableau à l'aide de boucles for/while imbriquées.
Code
using System; public class Program { public static void Main() { int[,] arr2D_i = new int[3, 3]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; //reading all the elements through for loop for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { Console.Write(arr2D_i[i, j] + "\t"); } Console.WriteLine("\n"); } } }
Sortie
La méthode GetLength()
D'accord. Mais l’exemple ci-dessus ne fonctionne que lorsque je connais au préalable le nombre d’éléments dans le tableau. Et si mon tableau est dynamique ? Comment parcourir tous les éléments d’un tableau dynamique ? Voici la méthode GetLength à notre secours.
int arr2D.GetLength(0); //renvoie la première dimension (lignes)
int arr2D.GetLength(1); // renvoie la deuxième dimension (colonnes)
Code
using System; public class Program { public static void Main() { int[,] arr2D_i = new int[3, 3]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; //reading all the elements through for loop for (int i = 0; i < arr2D_i.GetLength(0); i++) { for (int j = 0; j < arr2D_i.GetLength(1); j++) { Console.Write(arr2D_i[i, j] + "\t"); } Console.WriteLine("\n"); } } }
Sortie
La puissance de chaque boucle
La boucle for-each exécute un ensemble de commandes pour chaque élément du tableau. Il s'agit d'un mécanisme de bouclage très puissant et son utilisation est fortement recommandée car il est plus efficace qu'une boucle for traditionnelle.
Code
using System; public class Program { public static void Main() { string[,] arr2D_s = new string[3, 3]{{"one", "two", "three"}, {"four","five","six"}, {"seven","eight","nine"}}; //reading all the elements through foreach loop foreach(var ele in arr2D_s) { Console.WriteLine(ele); } } }
Sortie
Voyons maintenant un exemple sur la façon d'insérer des éléments dans un tableau 2D C#. L'idée est de parcourir chaque position du tableau et de lui attribuer une valeur.
Code
using System; public class Program { public static void Main() { int[,] arr2D_i = new int[3, 3]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int[,] squares = new int[3, 3]; int[,] cubes = new int[3, 3]; for (int i = 0; i < arr2D_i.GetLength(0); i++) { for (int j = 0; j < arr2D_i.GetLength(1); j++) { squares[i, j] = arr2D_i[i, j] * arr2D_i[i, j]; cubes[i, j] = squares[i, j] * arr2D_i[i, j]; } } Console.WriteLine("Squares\n"); DisplayArray(squares); Console.WriteLine("\n\nCubes\n"); DisplayArray(cubes); } static void DisplayArray(int[, ] arr) { for (int i = 0; i < arr.GetLength(0); i++) { for (int j = 0; j < arr.GetLength(1); j++) { Console.Write(arr[i, j] + "\t"); } Console.WriteLine("\n"); } } }
Output
We will update our array to multiply each element with 2. The idea is to traverse each position of the array and update the value it holds.
Code
using System; public class Program { public static void Main() { int[, ] arr2D_i = new int[3, 3]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; Console.WriteLine("Original Array\n"); DisplayArray(arr2D_i); for (int i = 0; i < arr2D_i.GetLength(0); i++) { for (int j = 0; j < arr2D_i.GetLength(1); j++) { arr2D_i[i, j] *= 2; } } Console.WriteLine("\n\nUpdated Array (multiplied by 2)\n"); DisplayArray(arr2D_i); } static void DisplayArray(int[, ] arr) { for (int i = 0; i < arr.GetLength(0); i++) { for (int j = 0; j < arr.GetLength(1); j++) { Console.Write(arr[i, j] + "\t"); } Console.WriteLine("\n"); } } }
Output
This is a tricky operation. It is not possible to delete a single element from a true C# 2D Array. Deleting a single element will disturb the dimensions of the array such that it would no longer be a matrix. C# does not allow that unless it is a jagged array.
So, what is the solution? Do we delete the entire row or the entire column? No, C# would not allow that as well. The array is fixed in size when declared or initialized. It has fix bytes of memory allocated. We cannot change that at run time.
The solution here is to create a new array without the elements that we want to delete.
Code
using System; public class Program { public static void Main() { int[,] arr2D_i = new int[3, 3]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int[,] new_array = new int[2,2]; Console.WriteLine("Original Array\n"); DisplayArray(arr2D_i); int rowToDel = 2; int colToDel = 2; for (int i = 0; i < arr2D_i.GetLength(0); i++) { if(i==rowToDel) continue; for (int j = 0; j < arr2D_i.GetLength(1); j++) { if(j==colToDel) continue; new_array[i,j]=arr2D_i[i,j]; } } Console.WriteLine("\n\nArray after deleting elements\n"); DisplayArray(new_array); } static void DisplayArray(int[, ] arr) { for (int i = 0; i < arr.GetLength(0); i++) { for (int j = 0; j < arr.GetLength(1); j++) { Console.Write(arr[i, j] + "\t"); } Console.WriteLine("\n"); } } }
Output
Thus, we have seen how a 2D Array is implemented in C# and what are the various CRUD operations we can perform on it. We also learned the difference between a true 2D implementation and a jagged array. There are a lot more methods available in C# to assist the developers with working with Arrays at ease. Do check them out at the MSDN docs.
This is a guide to 2D Arrays in C#. Here we discuss the concept of jagged arrays along with operations on 2D arrays in C#. You may also look at the following articles to learn more-
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!