jueves, mayo 24, 2007

FindAll de Generics

Buenas a todos. Una de las ventajas de las listas, son la posibilidad de obtener otras listas con los datos filtrados de una primera.
¿Cómo lo haríamos? Supongamos que tenemos una lista de enteros y que queremos sacar dos listas, una con los pares y otra con los impares. El codigo sería el siguiente:

using System;
using System.Collections.Generic;
using System.Text;

namespace Pruebas_Lenguaje_C_Sharp
{
public class Find_All_Generics
{
public Find_All_Generics(List enteros)
{
if (enteros != null)
__enteros = enteros;
else
throw new Exception("List passed cannot be null");
}
private List __enteros;

public List Enteros
{
get
{
if (__enteros == null)
__enteros = new List();
return __enteros;
}
set
{
__enteros = value;
}
}
public List GetPares()
{
return Enteros.FindAll(FindPares);
}
public List GetImpares()
{
return Enteros.FindAll(FindImpares);
}
// Esta funcion debra devolver true para aquellos elementos que queramos filtrar.
// El metodo FindAll ejecutara este metodo por cada elemento de la lista y, si el
// resultado es True, lo añadirá al resultado
bool FindPares(int entero)
{
return (entero % 2 == 0);
}

bool FindImpares(int entero)
{
return (entero % 2 != 0);
}
}
}


En el Main, ponemos:

static void Main(string[] args)
{
List enteros = new List();

for (int i = 0; i < 10; i++)
enteros.Add(i);

Find_All_Generics exampleList = new Find_All_Generics(enteros);

Console.WriteLine("Pares: ");
foreach (int i in exampleList.GetPares())
Console.WriteLine(i);
Console.WriteLine("Impares: ");
foreach (int i in exampleList.GetImpares())
Console.WriteLine(i);
Console.ReadKey();
}

Y comprobamos el resultado.

Esto es muy útil para realizar filtros sobre las listas. Por ejemplo,
- De una lista de empleados, puedo querer sacar una lista de los que son mayores de 40 años.
- De una lista de eventos deportivos, puedo querer filtrar los que son el domingo que viene
- etc...

Muchísimas gracias a Gloria por enseñarme el "fántastico mundo del FindAll" :-)

No hay comentarios.: