Map & Grep, dal Perl al C#

di Andrea Zani, in .NET2,

Molto tempo fa avevo cominciato a studiare il Perl purtroppo presto abbandonato per altre esigenze. Ricordo che tra le prime cose che mi avevano colpito di questo linguaggio era l'enorme quantità di funzioni, trucchi, frizzi e slazzi presenti per variabili, matrici e quant'altro.

Proprio in questi giorni mi è capitato di trovare questo tutorial in cui vengono implementate due funzioni presenti nel Perl per le matrici con il nuovo Framework 2.0. In Perl queste funzioni sono:

  • Map
  • Grep

La prima permette di eseguire del codice per ogni elemento presente nella matrice e la seconda di filtrare i singoli elementi presenti, queste funzioni sono utili, per esempio, per copiare una matrice in un'altra dopo aver filtrato o modificato il contenuto dipendentemente dalle nostre necessità. Per le spiegazioni dettagliate rimando al tutorial prima citato, ma vediamo come funziona 'sta cosa in .Net 2.0.

Ipotizziamo, nel primo caso, di voler travasare il contenuto di una matrice di interi in un'altra, ma nella seconda vogliamo inserire solo i numeri dispari. In Perl il tutto si limiterebbe ad una sola chiamata alla funzione grep. Senza utilizzare tecniche partiolari, per compiere questa operazione, dovremo iterare il contenuto della prima matrice, effettuare il controllo, quindi inserire il dato nella seconda. Con il Framework 2.0 possiamo fare:

void Page_Load()
{
        int[] lista ={ 1, 2, 3, 4, 5, 6, 7, 8 };
        int[] filtra = Array.FindAll(
            lista,
            delegate(int numero) { return numero % 2 == 1; }
            );
        foreach (int i in filtra)
            Response.Write(string.Format("{0}<br /> ", i));
}

Come si può vedere, è presente una funziona statica in Array, FindAll, che permette di inserire una funzione anonima per il controllo di ogni singolo dato. Nell'esempio viene controllato banalmente se il numero è dispari.

Se volessimo invece eseguire delle operazioni per ogni elemento presente nella matrice - cosa che in Perl è possibile con il map - possiamo fare:

void Page_Load()
{
        int[] lista ={ 1, 2, 3, 4, 5, 6, 7, 8 };
        Array.ForEach(
        lista,
        delegate(int numero)
        {
            Response.Write(string.Format("{0}<br /> ", numero));
        }
        );
}

In questo esempio visualizziamo banalmente il contenuto della matrice. Anche in questo caso è presente una funzione anonima per il codice, ma possiamo anche inserire funzioni esterne:

void Page_Load()
{
        int[] lista ={ 1, 2, 3, 4, 5, 6, 7, 8 };
        Array.ForEach(
            lista,
            new Action<int>(Scrivi) // <- !!!
            );
}
private void Scrivi(int numero)
{
       Response.Write(string.Format("{0}<br />",numero));
}

A questo punto mi sovviene il dubbio: ma perché dovrei usare la funzione statica Array.ForEach quando la stessa cosa la ottengo con meno codice?

void Page_Load()
{
int[] lista ={ 1, 2, 3, 4, 5, 6, 7, 8 };
foreach (int numero in lista)
Response.Write(string.Format("{0}<br /> ", numero));
}

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese