15 dic 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  estudiantes = new List(){
        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 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.

Roy {aka. Foy}

Autor & Editor

Desarrallador y líder técnico, con experiencia en tecnologías Microsoft desde los tiempos del VB6 y el asp clásico hasta el .Net Core, pasando por COM+, javascript, angularjs, Ionic, xaml, cordova, MVC, Web Api, Sql Server, Oracle... . Ávido lector, apasionado programador.