C# - Array
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);