codigo-lambda-en-c-sharp

Volviendo a los tutoriales, dejare unos ejemplos de uso del Codigo Lambda en C#. Se vera lo util de manejar datos en memoria para no recurrir a cada rato a la base de datos para ordenar o filtrar datos.

Primero crearemos una grilla que tendra los resultados de nuestros codigos. Y la pantalla inicial se vera asi:

formulario-lambda

Para cargar la grilla, usaremos una Lista de Entidades. En este caso, agregaremos una clase al proyecto web que sera la entidad Alumno. Y que tendra los siguientes atributos:

public class Alumno
{
private string rut;
private string dv;
private string nombre;
private string apellido;
private string ramo;
private double promedio;

public Alumno()
{
//
// TODO: Add constructor logic here
//
}

public string RUT
{
get
{
return rut;
}
set
{
rut = value;
}
}

public string DV
{
get
{
return dv;
}
set
{
dv = value;
}
}

public string Nombre
{
get
{
return nombre;
}
set
{
nombre = value;
}
}

public string Apellido
{
get
{
return apellido;
}
set
{
apellido = value;
}
}

public string Ramo
{
get
{
return ramo;
}
set
{
ramo = value;
}
}

public double Promedio
{
get
{
return promedio;
}
set
{
promedio = value;
}
}

public string RutCompleto
{
get
{
return rut + “-” + dv;
}
}
}

En nuestra pagina web, crearemos un metodo que llene esta lista de Entidades. Hay que asegurarse de tener en los using la libreria System.Collections.Generic para porder usar las listas directamente(List).

El codigo de este metodo seria el siguiente:

//variables privadas de la pagina web
private static List<Alumno> listaAlumnos;
private Alumno alumno;

private void CargarListaAlumnos()
{
listaAlumnos = new List<Alumno>();

alumno = new Alumno();
alumno.RUT = “1”;
alumno.DV = “9”;
alumno.Nombre = “Juan”;
alumno.Apellido = “Perez”;
alumno.Ramo = “Matematicas”;
alumno.Promedio = 5.5;
listaAlumnos.Add(alumno);

alumno = new Alumno();
alumno.RUT = “2”;
alumno.DV = “7”;
alumno.Nombre = “Rosa”;
alumno.Apellido = “Espinoza”;
alumno.Ramo = “Oratoria”;
alumno.Promedio = 7.0;
listaAlumnos.Add(alumno);

alumno = new Alumno();
alumno.RUT = “3”;
alumno.DV = “5”;
alumno.Nombre = “Luis”;
alumno.Apellido = “Jara”;
alumno.Ramo = “Ingles”;
alumno.Promedio = 3.0;
listaAlumnos.Add(alumno);

alumno = new Alumno();
alumno.RUT = “4”;
alumno.DV = “3”;
alumno.Nombre = “Pedro”;
alumno.Apellido = “Sabat”;
alumno.Ramo = “Etica”;
alumno.Promedio = 3.9;
listaAlumnos.Add(alumno);

alumno = new Alumno();
alumno.RUT = “5”;
alumno.DV = “1”;
alumno.Nombre = “Pamela”;
alumno.Apellido = “Diaz”;
alumno.Ramo = “Compañerismo”;
alumno.Promedio = 2.0;
listaAlumnos.Add(alumno);

alumno = new Alumno();
alumno.RUT = “7”;
alumno.DV = “8”;
alumno.Nombre = “Arturo”;
alumno.Apellido = “Vidal”;
alumno.Ramo = “Obediencia”;
alumno.Promedio =2.0;
listaAlumnos.Add(alumno);

alumno = new Alumno();
alumno.RUT = “10”;
alumno.DV = “8”;
alumno.Nombre = “Claudio”;
alumno.Apellido = “Borghi”;
alumno.Ramo = “Futbol”;
alumno.Promedio = 3.0;
listaAlumnos.Add(alumno);

alumno = new Alumno();
alumno.RUT = “11”;
alumno.DV = “6”;
alumno.Nombre = “Juana”;
alumno.Apellido = “Poblete”;
alumno.Ramo = “Castellano”;
alumno.Promedio = 3.5;
listaAlumnos.Add(alumno);

alumno = new Alumno();
alumno.RUT = “12”;
alumno.DV = “4”;
alumno.Nombre = “Roberto”;
alumno.Apellido = “Barahona”;
alumno.Ramo = “Castellano”;
alumno.Promedio = 6.5;
listaAlumnos.Add(alumno);

//cargo la grilla con la lista de entidades
GvLambda.DataSource = listaAlumnos;
GvLambda.DataBind();
}

Este metodo se debe llamar en el Page_Load de nuestra pagina:

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
CargarListaAlumnos();
}
}

Ahora veremos el codigo del boton que ordenara nuestra lista (y la grilla) de forma ascendente por Apellido:

protected void btnOrdenxApellido_Click(object sender, EventArgs e)
{
listaAlumnos.Sort((p1, p2) => p1.Apellido.CompareTo(p2.Apellido));
GvLambda.DataSource = listaAlumnos;
GvLambda.DataBind();
}

El metodo SORT que tiene cada lista generica, puede ejecutar nuestro codigo lambda que hace una comparacion de  los items que tiene la lista (p1, p2),  los compara uno por uno y los ordena.

Mismo codigo para ordenar por Promedio pero cambiamos el atributo:

protected void btnOrdenxPromedio_Click(object sender, EventArgs e)
{
listaAlumnos.Sort((p1, p2) => p1.Promedio.CompareTo(p2.Promedio));
GvLambda.DataSource = listaAlumnos;
GvLambda.DataBind();
}

formulario-lambda-ordenar-por-promedio

Para filtrar una lista, en este caso, que el Apellido empiece por un texto o caracter, el codigo es el siguiente:

protected void btnFiltroApellido_Click(object sender, EventArgs e)
{
listaAlumnos.RemoveAll(orden => !orden.Apellido.ToUpper().StartsWith(txtFiltroApellido.Text.ToUpper()));

GvLambda.DataSource = listaAlumnos;
GvLambda.DataBind();
}

formulario-lambda-filtro-por-apellido

Con el medoto RemoveAll, quitamos todos los elementos de la lista (orden) que NO empiecen con el texto ingresado (txtFiltroApellido.Text). Usamos el metodo ToUpper() para asegurarnos que incluya minusculas y mayusculas sin distincion.

En este ultimo caso, al filtrar la lista, la estamos modificando para el resto del programa, asi que en este caso se debe “guardar” la lista original en una variable auxiliar.

Eso seria este mini tutorial, dejo el proyecto completo aqui disponible (Codigo Lambda)

Prueben y comenten.

Saludos.

Links relacionados:

C#: Desmitificando las expresiones lambda (I)

¿Qué son las Expresiones Lambda?

Expresiones lambda (Guía de programación de C#)