95 - Expresiones lambda : Acceso a las variables externas a la expresión lambda |
Hemos visto en conceptos anteriores que una expresión lambda es cuando enviamos a un método una función anónima.
Dentro de la función lambda podemos acceder a los parámetros de la misma si los tiene, definir variables locales y veremos ahora que podemos acceder a variables externas a la expresión lambda definida.
Confeccionar una clase que administre un vector con 5 elementos enteros.
Definir un método que recorra el vector y llame a una expresión lambda que pueda analizar cada elemento del vector.
Llamar al método que recorre el vector y resolver mediante lambdas los siguientes algoritmos:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lambda4
{
public delegate void Retorna(int elemento);
public class Vector
{
private int[] vec = { 10, 23, 200, 12, 75 };
public void Imprimir()
{
Console.WriteLine("Listado completo del vector.");
foreach (var elemento in vec)
Console.Write("{0}-", elemento);
Console.WriteLine();
}
public void Recorrer(Retorna retorna)
{
foreach (var elemento in vec)
retorna(elemento);
}
}
class Program
{
static void Main(string[] args)
{
Vector v = new Vector();
v.Imprimir();
var multiplos3 = 0;
v.Recorrer(elemento => {
if (elemento % 3 == 0)
multiplos3++;
});
Console.WriteLine("Cantidad de elementos múltiplos de 3: {0}", multiplos3);
var suma = 0;
v.Recorrer(elemento => {
if (elemento > 50)
suma += elemento;
});
Console.WriteLine("La suma de todas las componentes superiores a 50: {0}", suma);
Console.ReadKey();
}
}
}
Definimos un delegado que recibe un entero y no retorna nada:
public delegate void Retorna(int elemento);
Declaramos una clase llamada Vector que define un arreglo de enteros y almacena 5 valores:
public class Vector
{
private int[] vec = { 10, 23, 200, 12, 75 };
Imprimimos el arreglo en forma completa:
public void Imprimir()
{
Console.WriteLine("Listado completo del vector.");
foreach (var elemento in vec)
Console.Write("{0}-", elemento);
Console.WriteLine();
}
El método Recorrer recibe un delegado y mediante el mismo llama a la expresión lambda pasando en cada llamada un elemento del arreglo:
public void Recorrer(Retorna retorna)
{
foreach (var elemento in vec)
retorna(elemento);
}
En la función Main creamos un objeto de la clase Vector:
static void Main(string[] args)
{
Vector v = new Vector();
v.Imprimir();
Lo nuevo aparece cuando llamamos al método Recorrer y dentro de la expresión lambda tenemos acceso al contador multplos3:
var multiplos3 = 0;
v.Recorrer(elemento => {
if (elemento % 3 == 0)
multiplos3++;
});
Console.WriteLine("Cantidad de elementos múltiplos de 3: {0}", multiplos3);
Para sumar los elementos mayores a 50 fuera de la expresión lambda definimos e iniciamos un acumulador llamado "suma" y luego lo modificamos dentro de la expresión lambda:
var suma = 0;
v.Recorrer(elemento => {
if (elemento > 50)
suma += elemento;
});
Console.WriteLine("La suma de todas las componentes superiores a 50: {0}", suma);