Introduzione alle matrici 2D in C #

Le matrici bidimensionali sono una raccolta di elementi omogenei che si estendono su più righe e colonne, assumendo la forma di una matrice. Di seguito è riportato un esempio di un array 2D che ha m righe e n colonne, creando così una matrice di configurazione mxn.

( a1, a2, a3, a4, …, an
b1, b2, b3, b4, …, bn
c1, c2, c3, c4, …, cn
.
.
.
m1, m2, m3, m4, …, mn )

Concetto di array frastagliati

Un array frastagliato è un array di array. Le matrici frastagliate sono essenzialmente più matrici frastagliate insieme per formare una matrice multidimensionale. Un array frastagliato bidimensionale può assomigliare a questo:

( ( a1, a2, a3, a4, …, an ),
( b1, b2, b3, b4, …, b20 ),
( c1, c2, c3, c4, …, c30 ),
.
.
.
( m1, m2, m3, m4, …, m25 ) )

Si noti che tutte le righe di un array frastagliato possono contenere o meno lo stesso numero di elementi.

Array 2D reali e array frastagliati

Le matrici frastagliate sono completamente diverse da una vera matrice 2D dal punto di vista dell'implementazione. È importante capire come C # implementa sia array multidimensionali sia array frastagliati.

I linguaggi di programmazione differiscono nella loro implementazione di array multidimensionali. Alcuni linguaggi di programmazione come C, C ++, C #, Fortran, ecc. Supportano array 2D reali. Mentre ce ne sono altri che simulano questo comportamento con matrici di matrici dette matrici frastagliate. Quindi, in che modo una vera matrice bidimensionale differisce dalle matrici frastagliate?

Le due implementazioni di array multidimensionali sono diverse in termini di consumo di memoria. Mentre un vero array 2D avrebbe m righe di n elementi ciascuna, un array frastagliato potrebbe avere m righe ciascuna con un numero diverso di elementi. Questo porta ad uno spazio minimo sprecato per insiemi di dati. Pertanto, l'array sotto-frastagliato va perfettamente bene:

int()() jagged array = ( (1, 2, 3, 4),
(5, 6, 7),
(8, 9) )

Se lo stesso set di dati fosse stato implementato in un vero array 2D, sarebbe stato il seguente:

int(, ) multiDimArray = ( 1, 2, 3, 4
5, 6, 7, 0
8, 9, 0, 0 )

Operazioni su array 2D in C #

Ecco alcune operazioni su array 2D fornite di seguito:

1. Costruisci array C # 2D

Vediamo un modo su come dichiarare un array 2D in C # e un altro modo su come non dichiarare un array 2D in C #.

Come?

Una vera implementazione di array 2D in C # inizia con la dichiarazione di array. Sembra di seguito:

int(, ) arr2D;
string(, ) arr2D_s;

Il numero di virgole nella definizione determina la dimensione dell'array. Si noti che non è possibile specificare la dimensione dell'array nella dichiarazione dell'array. Deve essere eseguito durante l'inizializzazione di un array.

Come non farlo?

È facile confondersi tra le implementazioni di array 2D e array frastagliati. Una dichiarazione di array frastagliato appare come di seguito:

int()() jagged array;

2. Inizializza array C # 2D

Il prossimo passo è inizializzare l'array 2D che abbiamo appena dichiarato. Esistono diversi modi per farlo.

Utilizzando il nuovo operatore

arr2D = new int(2, 3); //separate initialization
string(, ) arr2D_s = new string(4, 5); //with declaration

Inizializzazione con valori

//without dimensions
arr2D = new int(, )((1, 2), (3, 4), (5, 6));
//with declaration
arr2D_s = new string(2, 2)((“one”, ”two”), (“three”, “four”));

Senza il nuovo operatore

Int(, ) arr2D_a = ((1, 2), (3, 4), (5, 6), (7, 8));

3. Leggi gli elementi dall'array 2D C #

Leggi un singolo elemento

L'operazione successiva è leggere gli elementi dall'array 2D. Poiché l'array 2D è una matrice di elementi mxn, ogni elemento ha una combinazione di indice di riga e indice di colonna designati. Possiamo accedere agli elementi fornendo l'indice di riga e l'indice di colonna nel pedice. Un esempio è di seguito:

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'

Nota: gli indici di righe e colonne iniziano da 0. Pertanto, la posizione dell'indice (0, 0) è il primo elemento e (m-1, n-1) è l'ultimo elemento dell'array.

Leggi tutti gli elementi

Ma il metodo sopra ci dà il valore di un singolo elemento nella matrice. Come attraversiamo l'intero array per leggere ogni suo elemento? La soluzione semplice sta eseguendo il ciclo dell'intero array utilizzando i cicli nidificati per / while.

Codice

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");
)
)
)

Produzione

Il metodo GetLength ()

Va bene. Ma l'esempio sopra funziona solo quando conosco in anticipo il numero di elementi nell'array. Cosa succede se il mio array è dinamico? Come posso attraversare tutti gli elementi di un array dinamico? Ecco il metodo GetLength in nostro soccorso.

int arr2D.GetLength (0); // restituisce la prima dimensione (righe)

int arr2D.GetLength (1); // restituisce la seconda dimensione (colonne)

Codice

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");
)
)
)

Produzione

Il potere di per ogni ciclo

Il ciclo for-each esegue un set di comandi per ciascun elemento dell'array. Questo è un meccanismo di loop molto potente ed è altamente raccomandato da usare in quanto è più efficiente di un tradizionale loop.

Codice

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

Produzione

4. Inserire elementi nell'array 2D C #

Ora vediamo un esempio su come inserire elementi in un array C # 2D. L'idea è di attraversare ogni posizione dell'array e assegnargli un valore.

Codice

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");
)
)
)

Produzione

5. Aggiornare gli elementi nell'array 2D C #

Aggiorneremo il nostro array per moltiplicare ogni elemento con 2. L'idea è di attraversare ogni posizione dell'array e aggiornare il valore che contiene.

Codice

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");
)
)
)

Produzione

6. Eliminare gli elementi nell'array 2D C #

Questa è un'operazione complicata. Non è possibile eliminare un singolo elemento da un array C # 2D reale. L'eliminazione di un singolo elemento disturberà le dimensioni dell'array in modo che non sia più una matrice. C # non lo consente a meno che non sia un array frastagliato.

Allora, qual è la soluzione? Eliminiamo l'intera riga o l'intera colonna? No, anche C # non lo permetterebbe. L'array ha dimensioni fisse quando dichiarato o inizializzato. Ha allocato byte di memoria fissi. Non possiamo cambiarlo in fase di esecuzione.

La soluzione qui è creare un nuovo array senza gli elementi che vogliamo eliminare.

Codice

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");
)
)
)

Produzione

Conclusione

Quindi, abbiamo visto come un array 2D è implementato in C # e quali sono le varie operazioni CRUD che possiamo eseguire su di esso. Abbiamo anche imparato la differenza tra una vera implementazione 2D e un array frastagliato. Esistono molti più metodi disponibili in C # per aiutare gli sviluppatori a lavorare facilmente con gli array. Controllali nei documenti MSDN.

Articoli consigliati

Questa è una guida agli array 2D in C #. Qui discutiamo il concetto di array frastagliati insieme alle operazioni su array 2D in C #. Puoi anche consultare i seguenti articoli per saperne di più-

  1. Array 2D in Java
  2. Array 2D in Python
  3. Matrici in C #
  4. Matrici in C ++
  5. Matrici in PHP
  6. Grafica 2D in Java
  7. Come funzionano le matrici e le liste in Python?
  8. Matrici multidimensionali in C ++ con esempi
  9. Matrici 2D in PHP

Categoria: