sábado, 15 de diciembre de 2012

Filtrado de List<>

Problema: tengo una lista de objetos y necesito una lista de la misma clase de objetos pero filtrada dado un criterio basado en un alguna propiedad de la clase del objeto.

Solución: hay varias: recorrer la lista con un Foreach, hacer una consulta con Linq o usar una expresión lambda. Como se ve más elegante la expresión y ademas es un ámbito que casi no domino probemos esta última.

Probando: Primero creamos nuestra clase de prueba. En este caso una sencilla clase estudiante que contiene el nombre, una nota y un booleano para saber si esta eximido.

    public class estudiante
    {
        public string nombre { get; set; }
        public int nota { get; set; }
        public bool eximido { get; set; }
    }
Segundo, la consola en la que utilizaremos una lista de estudiantes.
static void Main(string[] args)
{
    List <estudiante> estudiantes = new List<estudiante>(){
        new estudiante(){nombre ="Foy", nota=90, eximido = true },
        new estudiante(){nombre ="Fer", nota=60, eximido = false },
        new estudiante(){nombre ="Fran", nota=92, eximido = true },
        new estudiante(){nombre ="Fidel", nota=91, eximido = true },
    };
Finalmente usamos el método FindAll que recibe una función predicado, o sea, una función lambda que devuelva true, para los items que deseamos obtener como una lista de la misma clase estudiante. Y el recorrido para mostrar el resulta en consola.
List<estudiante> Eximidos = estudiantes.FindAll(i => i.eximido == true);

foreach (estudiante eximido in Eximidos)
{
    Console.WriteLine("{0} Nota: {1}", eximido.nombre, eximido.nota);
}
Console.ReadLine();
En esta caso la lista será filtrada por los estudiantes que tiene el indicador de eximidos en true, resultando en:

Es prudente señalar que por dentro el FindAll utiliza un foreach para devolver el resultado pero como podemos ver es un método sencillo y elegante para filtrar listas genéricas.

Leia Mais…