Pagina personale di:
Carlo Vecchio
appunti di C#, R, SQL Server, ASP.NET, algoritmi, numeri
Vai ai contenuti

C# - Array

C#

Definizione
   •   Dichiarazione generica di un array:

   tipo_di_dato[] nome_array;

   •   Esempio:

   int[] Dati;
   Dati =
new int[10];

   •   o brevemente:

   int[] Dati = new int[10];

   •   o brevemente con inizializzazione in uno dei modi seguenti:

   int[] Dati = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
   
int[] Dati = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
   
int[] Dati = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

   •   Scrivere e leggere un array:

   for (int i = 0; i < 10; i++)
   {
       
// scrive la posizione i-esima dell'array
       Dati[i] = i * i;
       
// legge la posizione i-esima dell'array
       System.
Console.WriteLine(Dati[i]);
   }


   •   Le proprietà '.Length'
e '.GetLength' restituiscono il numero di elementi di un array; la prima restituisce il numero totale di elementi, la seconda il numero di elementi nel sotto-array.
   •   Esempi:

   Dati.Length
   Dati.GetLength(0)


   •   Per ciclare un array, si può utilizzare un classico ciclo for
oppure un foreach.
   •   Con il foreach, gli elementi però solo read-only, mentre con il for possono essere anche scritti.
   •   Un esempio per ciclare tutti gli elementi di un array:

   char[] Dati = new char[] { 'A', 'B', 'D', 'E', 'F' };
   
foreach (char x in Dati)
   {
       System.
Console.WriteLine(x);
   }

Array multi-dimensionali
   •   Gli array multi-dimensionali sono array "rettangolari": ogni riga ha lo stesso numero di elementi.
   •   Per dichiarare un array a due dimensioni:

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

   •   con inizializzazione:

   int[,] Dati = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };

   •   Anche un array multi-dimensionale può essere ciclato con foreach
:

   foreach (int item in Dati)
   {
       
Console.WriteLine(item);
   }
   
Console.ReadKey();

   •   Il risultato è l'insieme di tutti gli elementi, da 1 a 9.

Copia di array
   •   Gli array sono tipi riferimento
(non sono tipi valore) per cui vengono allocati nell’heap (no nello stack).
   •   Il seguente codice copia SOLO il riferimento di un array:

   int[] a1 = { 1, 2, 3, 4 };
   
int[] a2 = a1;

   •   I due array ‘a1’ e ‘a2’ fanno riferimento alla stessa area di memoria, per cui se si modifica un elemento di a1, si modifica anche l’elemento corrispondente di a2, e viceversa.
   •   Per eseguire una copia di un array e lavorare sulla copia in modo indipendentente dall’array originale, occorre utilizzare uno dei metodi seguenti.

   •   Metodo 1 (non consigliato):
definire un nuovo array e ricopiare tutti gli elementi dall’array sorgente all’array destinazione.

   int[] a1 = { 1, 2, 3, 4 };
   
int[] a2 = new int[a1.Length];
   
for (int i = 0; i < a1.Length; i++)
       a2[i] = a1[i];


   •   Metodo 2 (consigliato):
utilizzare uno dei seguenti metodi contenuti nella classe System.Array.
   •   Il metodo ‘CopyTo’
consente di copiare un array in un altro array a partire da un indice indicato.

   int[] a1 = { 1, 2, 3, 4 };
   
int[] a2 = new int[a1.Length];
   a1.CopyTo(a2, 0);


   •   Il metodo ‘Copy’
consente di copiare un array in un altro array; ha diversi overload che permettono di eseguire delle copie parziali di dati.

   int[] a1 = { 1, 2, 3, 4 };
   
int[] a2 = new int[a1.Length];
   System.
Array.Copy(a1, a2, a1.Length);

   •   Il metodo ‘Clone’
esegue un clone di un array; necessita di un casting esplicito in quanto il metodo restituisce un oggetto.

   int[] a1 = { 1, 2, 3, 4 };
   
int[] a2 = new int[a1.Length];
   a2 = (
int[])a1.Clone();

Verificare che due array siano uguali
   •   Per verificare che due array abbiano la stessa lunghezza e gli stessi elementi, si può utilizzare la classe Linq e il metodo SequenceEqual:

   if (array1.SequenceEqual(array2))
   { }


La classe ArrayList
   •   La classe ‘ArrayList’
permette di eseguire facilmente operazioni sugli array che richiederebbero qualche riga di codice in più: inserimento e rimozione di elementi, ridimensionamenti, ordinamenti.
   •   La classe fa parte del namespace System.Collections.
   •   Esempio di utilizzo di un ArrayList di numeri (si può costruire un ArrayList di stringhe):

   // Creazione di un ArrayList
   ArrayList al =
new ArrayList();
   
int[] a = { 9, 10, 1, 2, 3, 4, 5, 5 }; // array di supporto
   
// Aggiunta di elementi *in_ultima_posizione*
   
foreach (int i in a)
       al.Add(i);
   
// Aggiunta di elementi *in_posizione_generica*
   al.Insert(2, -1);
   
// Rimozione di un elemento in base al *valore*
   al.Remove(5);
   
// Rimozione di un elemento in base alla *posizione*
   al.RemoveAt(5);

La classe Queue
   •   La classe ‘Queue’ permette di implementare un array di tipo FIFO (First-In-First-Out).
   •   La classe fa parte del namespace System.Collections.
   •   Esempio di utilizzo di una Queue di numeri (si può costruire una Queue di stringhe):

   // Creazione di una Queue
   Queue q =
new Queue();
   
int[] a = { 9, 10, 1, 2, 3 }; // array di supporto
   
// Aggiunta di elementi
   
foreach (int i in a)
       q.Enqueue(i);
   
// Rimozione di elementi
   
int r = (int)q.Dequeue();

La classe Stack
   •   La classe ‘Stack’
permette di implementare un array di tipo LIFO (Last-In-First-Out).
   •   La classe fa parte del namespace System.Collections.
   •   Esempio di utilizzo di uno Stack di numeri (si può costruire uno Stack di stringhe):

   // Crezione di uno Stack
   Stack s =
new Stack();
   
int[] a = { 9, 10, 1, 2, 3 }; // array di supporto
   
// Aggiunta di elementi
   
foreach (int i in a)
       s.Push(i);
   
// Rimozione di elementi
   
int r = (int)s.Pop();

La classe HashTable
   •   La classe ‘HashTable’
permette di implementare un array bidimensionale i cui elementi sono coppie di ‘key’ e ‘value’. Le chiavi non possono essere duplicate. L’iterazione di tutti gli elementi di una HashTable va fatta con un oggetto ‘DictionaryEntry’.
   •   La classe fa parte del namespace System.Collections.
   •   Esempio di utilizzo di una HashTable la cui chiave è un numero (si può costruire una HashTable la cui chiave è una stringa):

   // Creazione di una HashTable
   
Hashtable h = new Hashtable();
   
// Aggiunta di elementi
   h.Add(20,
"Andrea");
   h.Add(18,
"Bice");
   h.Add(25,
"Carlo");
   h.Add(29,
"Dario");
   
// Rimozione di elementi
   h.Remove(29);
   
// Elenco di tutti gli elementi
   
foreach (DictionaryEntry de in h)
       
Console.WriteLine("Key: {0} Value: {1}", de.Key, de.Value);

La classe SortedList
   •   La classe ‘SortedList’
permette di implementare un array bidimensionale i cui elementi sono coppie di ‘key’ e ‘value’. Le chiavi non possono essere duplicate. L’iterazione di tutti gli elementi di una SortedList va fatta con un oggetto ‘DictionaryEntry’. A differenza della HashTable, la classe SortedList mantiene gli elementi sempre ordinati per chiave.
   •   La classe fa parte del namespace System.Collections.
   •   Esempio di utilizzo di una SortedList la cui chiave è un numero (si può costruire una SortedList la cui chiave è una stringa):

   // Creazione di una SorterList
   
SortedList s = new SortedList();
   
// Aggiunta di elementi
   s.Add(20,
"Andrea");
   s.Add(18,
"Bice");
   s.Add(25,
"Carlo");
   s.Add(29,
"Dario");
   
// Rimozione di elementi
   s.Remove(29);
   
// Elenco di tutti gli elementi
   
foreach (DictionaryEntry de in s)
       
Console.WriteLine("Key: {0} Value: {1}", de.Key, de.Value);

© 2020 Carlo Vecchio
Torna ai contenuti