19

Sep

LINQ: Parte II

Ciao a tutti,

oggi si continua la precedente lezione con la descrizione delle varie caratteristiche di LINQ!  Partiamo subito!

 

Lambda Expressions

Le lamba expressions possono essere usare dove sono richiesti i delegati. Sono molto simili ai metodi anonimi ma hanno una sintassi molto abbreviata che li rende di facile utilizzo. Per esempio consideriamo il metodo Find dell’oggetto generico List. Questo metodo accetta un delegato come parametro. Se si osserva il tipo di delegato, si scopre che questo fa riferimento ad un metodo che accetta come singolo parametro di tipo T e restituisce un valore booleano. Formalmente, una lambda expression è un’espressione che include un input e contiene solo una singola istruzione che viene valutata per fornire un singolo valore di ritorno; tuttavia .NET Framework ci permette di poter passare più di un parametro in una lamba expression  racchiudendole tra parentesi graffe:

var found = cars.Find(c =>
{
int x;
x = theYear;
return c.Year == x;
});
 
 
Extension Methods

Gli Extension Methods consentono di aggiungere metodi a un tipo anche senza poter accedere al codice sorgente. Per capire il perché utilizzarli, immaginiamo un semplice scenario di questo tipo: si desidera aggiungere un metodo IsNumeric alla classe string, ma noi non abbiamo il codice sorgente della classe string! Una soluzione è di creare una nuova classe che eredita da string e di aggiungere il metodo IsNumeric in questa classe.  Il problema è che la classe stringa è chiusa e non permette di essere ereditata. Ecco che ci viene in aiuto l’extension method! Grazie ad esso possiamo creare un metodo di estensione per la classe string seguendo pochi semplici passi. Come prima cosa dobbiamo creare una classe public static, poi dobbiamo dichiarare il metodo IsNumeric anch’esso public static e per finire (cosa molto importante) dobbiamo utilizzare la parola chiave this prima della dichiarazione del parametro! Vediamo l’ esempio:

public static class StringHelper
{
public static bool IsNumeric(this string str)
{
double val;
return double.TryParse(str, out val);
}
}

Perfetto! Ora possiamo utilizzare questo extension method in questo modo:

string s = "123";
txtLog.AppendText(s.IsNumeric() + Environment.NewLine);

la nostra variabile s di tipo string espone il metodo da noi creato! La cosa bella è che ora, in qualsiasi parte del vostro progetto, ogni variabile di tipo string esporrà il metodo IsNumeric()!

Ecco alcune regole che dovete seguire per lavorare con gli extension methods:

  • Gli extension methods devono essere definiti in una classe statica(o modulo in VB).
  • La classe statica deve essere pubblica.
  • Se si definisce un metodo di estensione per un tipo, e il tipo ha già lo stesso metodo, verrà utilizzato il metodo originale del tipo e non quello creato da voi.
  • La classe ed gli extension methods devono essere statici.
  • Bisogna inserire la parola chiave this prima della dichiarazione del parametro!

 

Query Extension Methods

Microsoft ha aggiunto extension methods a diversi tipo, ma i più importanti sono quelli aggiunti alla interfaccia generica IEnumerable. Alcuni di questi metodi sono direttamente mappati alle parole chiave utilizzate da LINQ( come where o orderby).

Qui trovate tutti gli Enumerable Methods, vi consiglio di studiarli con cura(soprattutto i join) perché nell’esame ci sono molte domande su questo argomento!

Inoltre la classe Enumerable espone tre metodi molto comodi che sono:

  • Empty: Produce un oggetto generico IEnumerable senza elementi
  • Range: Utile quando si deve recuperare solo un Range di elementi.
  • Repeat: Accetta due parametri, Element e Count. Element è l’elemento che deve essere ripetuto e count indica quante volte.

 

Con questo è tutto!Abbiamo completato l’introduzione a LINQ. Naturalmente LINQ è un mondo molto vasto! io ho riportato solo le informazioni più importanti che ho studiato sul libro! Se qualcuno vuole aggiungere dei contenuti faccia pure Occhiolino!

Nel prossimo post vedremo come utilizzare le query LINQ!

Un saluto a tutti.

Carmine Punella

by Carmine Punella on 9/19/2011
Post archive