C#

ARRAYLIST

NB: ArrayList è deprecata in favore di LIST. In questo paragrafo daremo quindi solo alcuni cenni.

Il namespace System.Collections contiene una serie di classi estremamente utili e che vedremo in questo e nei prossimi paragrafi. Esse sono:
  • ArrayList
  • BitArray
  • HashTable
  • Queue
  • SortedList
  • Stack
In questo paragrafo, come da titolo, ci occupiamo della prima classe.

Una ArrayList rappresenta una collezione dinamica di oggetti posti in ordine sequenziale. La sua caratteristica principale è quella di poter modificare dinamicamente le proprie dimensioni a seconda delle necessità. In questo senso esiste quindi una grossa differenza rispetto agli array che, come abbiamo visto, presentano dimensioni immutabili.
Per istanziare un ArrayList abbiamo sostanzialmente 3 modi ma in questa sede ne considereremo solo due, quelli a mio avviso più pratici. Il primo sistema è decisamente banale:

ArrayList arrL = new ArrayList();

Questa semplice istruzione crea un ArrayList vuota con uno spazio a sua disposizione predefinito.
Un metodo alternativo fa uso della sintassi:

ArrayList arrL = new ArrayList(Int32);

predeterminando una capacità iniziale, utile qualora sappiate già di dover raggiunre una certa dimensione.

Per aggiungere elementi al suo interno possiamo usare il metodo Add(). Vediamo l'esempio, ricordando, banalmente, che è necessario includere il namespace Collections affinchè le cose funzionino:

  Esempio 16.1
1
2
3
4
5
6
7
8
9
10
11
12
13
using System;
using System.Collections;

class program
{
  public static void Main()
  {
    ArrayList arl01 = new ArrayList();
    arl01.Add(1);
    arl01.Add("ciao");
    Console.WriteLine(arl01.Count);
  }
}

L'esempio è abbastanza autoesplicativo. Una cosa che potete notare subito è la diversa natura degli elementi che abbiamo inserito, abbiamo infatti un intero, alla riga 9 ed una stringa, in quella successiva. Questo è il punto di forza, e forse ancor di più di debolezza di ArrayList che memorizza degli oggetti con tutta la pesantezza che questo comporta. La proprietà count invece ci restituisce il numero di elementi presenti mentre capacity indica la capacità corrente dell'ArrayList che state manipolando.
L'accesso ad un singolo elemento avviene tramite il consueto operatore [].

Console.WriteLine(arl01[1]);

Per inserire un elemento ad un dato indice si usa insert con la seguente sintassi:

insert(indice, elemento)


  Esempio 16.2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
using System.Collections;

class program
{
  public static void Main()
  {
    ArrayList arl01 = new ArrayList();
    arl01.Add(1);
    arl01.Add("ciao");
    arl01.Insert(1, 1000);
    foreach (object x in arl01) Console.WriteLine(x);
  }
}
 
Di passaggio possiamo vedere l'uso di foreach per eseguire un loop sui vari elementi. L'equivalente per togliere un elemento ad un specifica posizione è RemoveAt(indice), mentre Remove(elemento) elimina tutte le occorrenza di un certo elemento ed infine Clear svuota completamente l'ArrayList su cui lo applicate.

per reperire un elemento all'interno di un ArrayList avete IndexOf(elemento) e LastIndexOf(elemento), che restituiscono, rispettivamente, la prima e l'ultima occorrenza dell'elemento indicato.

Come vedete l'uso di questo costrutto è relativamente semplice e molto simile agli array. Potete controllare la documentazione ufficale per altri dettagli ma ricordate che nella scrittura di codice "moderno" ArrayList, considerato una classe un po', come dire, troppo "libertina" (non è type-safe, ad esempio), nonchè pesante e non particolarmente veloce (i tipi valore vengono sottoposti a continue operazioni di boxing ed unboxing), è quasi del tutto dimenticato, specie a partire dalla versione 2.0 coi suoi generics. Tuttavia la sua semplicità concettuale e la sua duttilità potrebbero tornare comode in qualche occasione in particolare per piccole applicazioni.