Matrici (confronto tra C# e Java)

Aggiornamento: novembre 2007

Le matrici sono insiemi ordinati di elementi dello stesso tipo di dati a cui è possibile accedere utilizzando il nome della matrice insieme all'offset dall'inizio della matrice dell'elemento desiderato. Esistono alcune differenze importanti nel modo in cui vengono dichiarate e utilizzate le matrici in C# rispetto a Java.

Matrice unidimensionale

In una matrice unidimensionale viene archiviato un numero fisso di elementi in modo lineare. È sufficiente pertanto il solo valore di indice per individuare un elemento. In C# le parentesi quadre nella dichiarazione della matrice devono seguire il tipo di dati e non possono essere inserite dopo il nome della variabile, operazione consentita in Java. Una matrice di tipo integers pertanto viene dichiarata utilizzando la sintassi riportata di seguito:

int[] arr1;

La dichiarazione riportata di seguito non è valida in C#:

//int arr2[];  //compile error

Dopo aver dichiarato una matrice, è necessario utilizzare la parola chiave new per impostarne la dimensione, come in Java. Nel codice riportato di seguito viene dichiarato il riferimento alla matrice:

int[] arr;
arr = new int[5];  // create a 5 element integer array

È quindi possibile utilizzare la stessa sintassi di Java per accedere agli elementi di una matrice unidimensionale. Anche gli indici di matrice C# sono in base zero. Per accedere all'ultimo elemento della matrice precedente, utilizzare la sintassi riportata di seguito:

System.Console.WriteLine(arr[4]);  // access the 5th element

Inizializzazione

Gli elementi delle matrici C# possono essere inizializzati al momento della creazione utilizzando la stessa sintassi di Java:

int[] arr2Lines;
arr2Lines = new int[5] {1, 2, 3, 4, 5};

Diversamente da Java, il numero degli inizializzatori C# deve corrispondere esattamente alla dimensione della matrice. È possibile utilizzare questa funzionalità per dichiarare e inizializzare una matrice C# su una sola riga:

int[] arr1Line = {1, 2, 3, 4, 5};

Questa sintassi consente di creare una matrice di dimensioni uguali al numero degli inizializzatori.

Inizializzazione in un ciclo di programma

L'altro modo per inizializzare una matrice in C# consiste nell'utilizzare il ciclo for. Il ciclo riportato di seguito consente di impostare su zero ciascun elemento di una matrice:

int[] TaxRates = new int[5];

for (int i=0; i<TaxRates.Length; i++)
{
    TaxRates[i] = 0;
}

Matrici irregolari

Sia C# che Java supportano la creazione di matrici irregolari, o non rettangolari, in cui ogni riga contiene un diverso numero di colonne. Ad esempio, la matrice irregolare riportata di seguito ha quattro voci nella prima riga e tre nella seconda:

int[][] jaggedArray = new int[2][];
jaggedArray[0] = new int[4];
jaggedArray[1] = new int[3];

Matrici multidimensionali

Con C# è possibile creare matrici multidimensionali regolari simili a una matrice di valori dello stesso tipo. Mentre le matrici irregolari sono supportate sia da Java che da C#, in C# sono supportate anche le matrici multidimensionali, o matrici di matrici.

Per dichiarare una matrice rettangolare multidimensionale, utilizzare la sintassi riportata di seguito:

int[,] arr2D;      // declare the array reference
float[,,,] arr4D;  // declare the array reference

Dopo aver dichiarato la matrice, è possibile allocarle memoria come illustrato di seguito:

arr2D = new int[5,4];  // allocate space for 5 x 4 integers

Per accedere agli elementi della matrice, utilizzare la sintassi riportata di seguito:

arr2D[4,3] = 906;

Poiché le matrici sono in base zero, questa riga imposta l'elemento della quinta colonna della quarta riga su 906.

Inizializzazione

Le matrici multidimensionali possono essere create, configurate e inizializzate in un'unica istruzione utilizzando uno dei modi riportati di seguito:

int[,] arr4 = new int [2,3] { {1,2,3}, {4,5,6} };
int[,] arr5 = new int [,]   { {1,2,3}, {4,5,6} };
int[,] arr6 =               { {1,2,3}, {4,5,6} };

Inizializzazione in un ciclo di programma

Tutti gli elementi di una matrice possono essere inizializzati utilizzando un ciclo nidificato, come illustrato di seguito:

int[,] arr7 = new int[5,4];

for(int i=0; i<5; i++)
{
    for(int j=0; i<4; j++)
    {
        arr7[i,j] = 0;  // initialize each element to zero
    }
}

Classe System.Array

In .NET Framework le matrici vengono implementate come istanze della classe Array. Questa classe fornisce numerosi metodi utili, tra cui Sort e Reverse.

Nell'esempio riportato di seguito viene illustrato come sia facile utilizzare questi metodi. Innanzitutto, si effettua l'inversione degli elementi di una matrice con il metodo Reverse, quindi li si ordina con il metodo Sort:

class ArrayMethods
{
    static void Main()
    {
        // Create a string array of size 5:
        string[] employeeNames = new string[5];

        // Read 5 employee names from user:
        System.Console.WriteLine("Enter five employee names:");
        for(int i=0; i<employeeNames.Length; i++)
        {
            employeeNames[i]= System.Console.ReadLine();
        }

        // Print the array in original order:
        System.Console.WriteLine("\nArray in Original Order:");
        foreach(string employeeName in employeeNames)
        {
            System.Console.Write("{0}  ", employeeName);
        }

        // Reverse the array:
        System.Array.Reverse(employeeNames);

        // Print the array in reverse order:
        System.Console.WriteLine("\n\nArray in Reverse Order:");
        foreach(string employeeName in employeeNames)
        {
            System.Console.Write("{0}  ", employeeName);
        }

        // Sort the array:
        System.Array.Sort(employeeNames);

        //  Print the array in sorted order:
        System.Console.WriteLine("\n\nArray in Sorted Order:");
        foreach(string employeeName in employeeNames)
        {
            System.Console.Write("{0}  ", employeeName);
        }
    }
}

Output

Enter five employee names:

Luca

Angie

Brian

Kent

Beatriz

Array in Original Order:

Luca Angie Brian Kent Beatriz

Array in Reverse Order:

Beatriz Kent Brian Angie Luca

Array in Sorted Order:

Angie Beatriz Brian Kent Luca

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Matrici (Guida per programmatori C#)

Altre risorse

Linguaggio di programmazione C# per sviluppatori Java