Lambda

Si ja sé que es el famoso logotipo de Half-life, pero aqui de la expresión lambda de C# y VB.NET y el simbolo a parte de traerme buenos recuerdos me gusta.

Es una expresión que aparece en el .Net 3.5 que te permite indicar el tipo FUNC en una sola linea. La expresión Lambda se caracteriza por tener el símbolo “=>” en C# o Function(…) en Visual Basic.

C# 
IEnumerable<string> cincoCaracs=nombres.Where<String>(s=>s.Length==5);

Vb.Net 
cincoCaracs=nombres.Where(Function(s) s.Length=5)

La expresión lambda se lee de la siguiente manera: La parte izquierda de la expresión (entiéndase la parte izquierda de => o lo que esta entre los paréntesis de la palabra Function(…)) son las variables que vamos a utilizar y que su tipo es inferido por los tipos genéricos del FUNC. La parte derecha es la implementación necesaria para devolver el tipo expresado como tipo de retorno en el FUNC. Por tanto, según el ejemplo, Where necesita un Func que devuelva un boolean (s.Length=5) y un parámetro que viene determinado por el genérico (en el caso de C#) o por los elementos de la lista en el caso de Visual Basic aunque no sea siempre así (“s” es tipo String) En .Net 3.5 las expresiones lambda solo podían tener una linea de implementación. En .Net 4 ya pueden tener más de una tal y como puedes ver en el siguiente ejemplo:

C# 

lista.Where<int>(c=>
{
  var x = c + 3;
  x = x * 4;
  return x==3;
 }).Select<int,int>(c=>c);

Vb.Net 

lista.Where(Function(c)
  Dim x = c + 3
  x = x * 4
  Return x = 3
 End Function).Select(Of Integer)(Function(c) c)

Entiendo y así me ocurre en todos los cursos que cuesta un poco entenderlo a primer vista, pero ten en cuenta que es muy fácil, lo único que necesitas es practicarlo un poco, yo te pongo unos ejemplos para que te ayuden a practicar.

C# 

//Buscar los enteros que sean mayor a tres
lista.Where<int>(c=>c>3);

//Buscar los mayores a tres ordenados de mayor a menor
lista.Where<int>(c=>c>3).OrderByDescending<int,int>(c=>c);

//De la lista de enteros recuperar otra lista con un tipo personalizado
lista.Select<int,ElEntero>(c=>new ElEntero {ElValor=c});

//De la lista de enteros recuperar otra lista con un tipo anónimo
lista.Select(c=>new {ElValor=c});

Vb.Net 

//Buscar los enteros que sean mayor a tres
lista.Where(Function(c) c>3)

//Buscar los mayores a tres ordenados de mayor a menor
lista.Where(Function(c) c>3).OrderByDescending(Of Integer)(Function(c) c)

//De la lista de enteros recuperar otra lista con un tipo personalizado
lista.Select(Of ElEntero)(Function(c) new ElEntero With {.ElValor=c})

//De la lista de enteros recuperar otra lista con un tipo anónimo
lista.Select(Function(c) new With {.ElValor=c});
Advertisements

Un pensament sobre “Lambda

  1. Retroenllaç: FUNC (El delegado genérico) | My freelancer life

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out / Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out / Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out / Canvia )

Google+ photo

Esteu comentant fent servir el compte Google+. Log Out / Canvia )

Connecting to %s