LAMBDA EXPRESSION
Una lambda expression in c sharp è un metodo anonimo avente parametri, un tipo di ritorno, se usiamo il delegate predefinito Func, ma non ha un nome. Il compilatore in presenza di una espressione lambda è in grado automaticamente di convertirla in una istanza di un delegate. Esistono due tipi di lambda expression:
- Expression lambda: (parameters) => expression è un metodo anonimo il cui body è costituito da una sola istruzione. Viene definita con un elenco di uno o più argomenti, il simbolo lambda => e una espressione C# valida.
- Statement lambda: (parameters) => {} il body non è formato da una sola istruzione ma da due o più che vengono racchiuse in un blocco di codice.
UTILIZZO DELLE LAMBDA EXPRESSION
using System; namespace LambdaExpression { class Program { static void Main(string[] args) { Func<string> hello = () => "Hello World!"; Console.WriteLine(hello()); Func<string,string> hello2 = (string nome) => $"Hello {nome}"; Console.WriteLine(hello2("Mario")); Action hello3 = () => Console.WriteLine("Hello!"); hello3(); /*SUPPONIAMO DI CALCOLARE IL MASSIMO TRA DUE NUMERI INTERI IL TIPO DEI PARAMETRI SI PUO' OMETTERE IN QUANTO IL COMPILATORE E' IN GARDO DI INFERIRE IL GIUSTO TIPO*/ Func<int,int,int> maxint = (num1,num2)=> Math.Max(num1,num2); Console.WriteLine(maxint(12,68)); /*SUPPONIAMO DI CALCOLARE IL MASSIMO TRA TRE DOUBLE IL TIPO DEI PARAMETRI SI PUO' OMETTERE IN QUANTO IL COMPILATORE E' IN GARDO DI INFERIRE IL GIUSTO TIPO*/ Func<double,double,double,double> maxdouble = (arg1,arg2,arg3) => Math.Max(Math.Max(arg1,arg2),arg3); Console.WriteLine(maxdouble(12.987,68.789,98.876)); /*--DATA UNA CERTA DATA DI NASCITA LA PERSONA PUO' GUIDARE O MENO NELLO STATO ITALIANO.*/ Func<DateTime,bool> canDrive = (data) => data.AddYears(18) <= DateTime.Today; Console.WriteLine(canDrive(new DateTime(2003,02,01))); /*--DATE IN INPUT DUE DATE VOGLIAMO SAPERE LA MAGGIORE*/ Func<DateTime,DateTime,DateTime> maxData = (data1,data2)=> data1 > data2 ? data1 : data2; Console.WriteLine(maxData(new DateTime(2020,12,31),DateTime.Today)); /*--ESEMPIO DI STATEMENT LAMBDA*/ Func<int,int,int> somma = (numero1,numero2) =>{ return numero1+numero2; }; Console.WriteLine(somma(10,5)); } } }
LAMBDA EXPRESSION IN C SHARP LE EXPRESSION-BODYED MEMBERS
L’operatore lambda viene usato anche in circostanze diverse rispetto a quello di cui ci siamo occupati sinora, ossia a membri che hanno un body con una sola espressione, metodi, costruttori, property.
using System; namespace LambdaExpression { class Program { static void Main(string[] args) { Func<string> hello = () => "Hello World!"; Console.WriteLine(hello()); Func<string,string> hello2 = (string nome) => $"Hello {nome}"; Console.WriteLine(hello2("Mario")); Action hello3 = () => Console.WriteLine("Hello!"); hello3(); /*SUPPONIAMO DI CALCOLARE IL MASSIMO TRA DUE NUMERI INTERI IL TIPO DEI PARAMETRI SI PUO' OMETTERE IN QUANTO IL COMPILATORE E' IN GARDO DI INFERIRE IL GIUSTO TIPO*/ Func<int,int,int> maxint = (num1,num2)=> Math.Max(num1,num2); Console.WriteLine(maxint(12,68)); /*SUPPONIAMO DI CALCOLARE IL MASSIMO TRA TRE DOUBLE IL TIPO DEI PARAMETRI SI PUO' OMETTERE IN QUANTO IL COMPILATORE E' IN GARDO DI INFERIRE IL GIUSTO TIPO*/ Func<double,double,double,double> maxdouble = (arg1,arg2,arg3) => Math.Max(Math.Max(arg1,arg2),arg3); Console.WriteLine(maxdouble(12.987,68.789,98.876)); /*--DATA UNA CERTA DATA DI NASCITA LA PERSONA PUO' GUIDARE O MENO NELLO STATO ITALIANO.*/ Func<DateTime,bool> canDrive = (data) => data.AddYears(18) <= DateTime.Today; Console.WriteLine(canDrive(new DateTime(2003,02,01))); /*--DATE IN INPUT DUE DATE VOGLIAMO SAPERE LA MAGGIORE*/ Func<DateTime,DateTime,DateTime> maxData = (data1,data2)=> data1 > data2 ? data1 : data2; Console.WriteLine(maxData(new DateTime(2020,12,31),DateTime.Today)); /*--ESEMPIO DI STATEMENT LAMBDA*/ Func<int,int,int> somma = (numero1,numero2) =>{ return numero1+numero2; }; Console.WriteLine(somma(10,5)); Console.WriteLine(HelloWorld("Mario")); MyClass mc = new MyClass("Mario"); Console.WriteLine(mc.Nome); } static string Hello(string nome) { return $"Ciao {nome}"; } /*EXPRESSION-BODYED MEMBERS*/ static string HelloWorld(string nome) => $"Hello World {nome}"; } /*EXPRESSION-BODYED MEMBERS*/ public class MyClass { private string nome; public string Nome { get => nome.ToUpper(); set => nome=value; } /*EXPRESSION-BODYED MEMBERS*/ public MyClass(string nome) => Nome = $"Ciao {nome}"; } }
APPROFONDIMENTO
Una lambda expression in C# è una funzione anonima che può contenere espressioni o blocchi di istruzioni e può essere utilizzata per creare delegati o espressioni di albero delle espressioni. Le lambda expressions sono particolarmente utili nelle operazioni LINQ (Language Integrated Query) per eseguire operazioni come il filtraggio, l’ordinamento e la trasformazione dei dati.
Sintassi delle Lambda Expressions
La sintassi di base di una lambda expression è la seguente:
(parameters) => expression
Oppure, se la lambda expression contiene un blocco di istruzioni:
(parameters) => {
// statements
}
Esempio di Lambda Expression
Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // Output: 25
Parti di una Lambda Expression
1. Parameters: I parametri della lambda expression sono racchiusi tra parentesi. Se la lambda non accetta parametri, le parentesi sono vuote. Se ha più parametri, questi sono separati da virgole. Se ha un solo parametro le parentesi si possono omettere.
(x, y) => x + y
2. Lambda operator (=>): L’operatore lambda “=>”, chiamato anche operatore freccia, separa i parametri dalla parte del corpo della lambda expression.
3. Expression o Statements: La parte successiva alla freccia può essere un’espressione singola o un blocco di istruzioni. Se è un’espressione singola, il risultato di tale espressione viene restituito automaticamente. Se è un blocco di istruzioni, è necessario usare l’istruzione return per restituire un valore.
Tipi di Lambda Expressions
1. Lambda espressione (Expression Lambdas): Sono costituite da una singola espressione.
Func<int, bool> isEven = x => x % 2 == 0;
2. Lambda espressioni di istruzioni (Statement Lambdas): Contengono un blocco di istruzioni.
Action<string> greet = name =>
{
string greeting = $”Hello, {name}!”;
Console.WriteLine(greeting);
};
Utilizzo delle Lambda Expressions
Le lambda expressions sono spesso utilizzate con delegati e tipi generici come Func, Action e Predicate.
• Func<T, TResult>: Rappresenta un delegato che accetta uno o più parametri e restituisce un valore.
Func<int, int, int> add = (x, y) => x + y;
Console.WriteLine(add(3, 4)); // Output: 7
•Action: Rappresenta un delegato che accetta uno o più parametri e non restituisce un valore.
Action<string> print = message => Console.WriteLine(message);
print(“Hello, World!“); // Output: Hello, World!
•Predicate: Rappresenta un delegato che accetta un parametro e restituisce un valore booleano.
Predicate<int> isPositive = number => number > 0;
Console.WriteLine(isPositive(5)); // Output: True
Lambda Expressions e LINQ
Le lambda expressions sono molto utilizzate nelle query LINQ per manipolare collezioni di dati in modo dichiarativo.
Esempio di LINQ con Lambda Expressions
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
foreach (var num in evenNumbers)
{
Console.WriteLine(num); // Output: 2 4 6
}
In questo esempio, n => n % 2 == 0 è una lambda expression che viene passata al metodo Where per filtrare i numeri pari.
Conclusione
Le lambda expressions in C# sono potenti strumenti per scrivere codice conciso e leggibile, specialmente quando si lavora con delegati e LINQ. Permettono di definire funzioni in linea senza dover dichiarare esplicitamente un metodo, migliorando la manutenibilità e la chiarezza del codice.
Lascia un commento