Supongamos ahora el caso que tenemos la siguiente clase
public class Equipo : IEnumerable<jugador>
{
public IEnumerable<jugador> Jugadores { get; set; }
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<jugador> GetEnumerator()
{
return Jugadores.GetEnumerator();
}
}
public class Jugador
{
public string Nombre { get; set; }
public Posicion Posicion { get; set; }
}
public enum Posicion
{
Arquero, Defensor, Mediocampista, Delantero
}
Entonces a nuestra clase Equipo lo que queremos agregarle es un método que aplique un filtro sobre la colección de Jugadores dependiendo del tipo de Posicion que tenga. Para esto lo que vamos a hacer es crear una clase ExtendedMethod la cual va a contener el método que va a realizar el filtrado de la colección.
Nuestra clase va a quedar asi
public static class ExtendedMethod
{
public static IEnumerable<jugador> FiltrarPorPosicion(this IEnumerable<jugador> equip, Func<jugador, bool> param)
{
foreach (Jugador jugador in equip)
{
if (param(jugador))
yield return jugador;
}
}
}
Vamos a explicar básicamente de que se trata el método FiltrarPorPosicion, como ya vieron recién este método recibe como parámetro del tipo IEnumerable donde aclaramos el tipo genérico a utilizar, este parámetro es simplemente la clase donde se va a agregar nuestro nuevo método. El segundo parámetro no es ni mas ni menos que nuestra expresión Lambda, la cual vamos a utilizar para realizar el filtrado, mas adelante vamos a hablar de como esta formada.
Mas abajo hay simplemente algo que a mi me parece una genialidad y es la palabra reservada yield, para que nos sirve, para generar una variable temporal del tipo de la colección que estamos a punto de devolver, nada mas ni nada menos, ¿una genialidad no?.
El llamado de este nuevo método lo podemos validar fácilmente de la siguiente manera, creando una nueva aplicación de consola.
class Program
{
static void Main(string[] args)
{
IEnumerable<jugador> equip = new Equipo{
Jugadores = new List <jugador>
{
new Jugador { Nombre = "Juan Carlos", Posicion = Posicion.Arquero },
new Jugador { Nombre = "Jose Luis", Posicion = Posicion.Defensor },
new Jugador { Nombre = "Pedro Ruben", Posicion = Posicion.Defensor },
new Jugador { Nombre = "Juanito Perez", Posicion = Posicion.Mediocampista },
new Jugador { Nombre = "Castulo Lopez", Posicion = Posicion.Delantero },
new Jugador { Nombre = "Soberano Reimondo", Posicion = Posicion.Delantero },
}
};
foreach(Jugador jug in equip.FiltrarPorPosicion(x => x.Posicion == Posicion.Delantero))
{
System.Console.WriteLine(jug.Nombre);
}
System.Console.Read();
}
}
Como habrán podido ver esta herramienta es algo muy simple de implementar y a la vez muy potente. Antes de despedirme quiero dejarles un adelanto de lo que es Linq y como podríamos utilizarlo para hacer la selección de los equipos a filtrar, y seria algo así
public static class ExtendedMethod
{
public static IEnumerable<jugador> FiltrarPorPosicion(this IEnumerable<jugador> equip, Func<jugador,bool> param)
{
return equip.Where(param);
}
}
Bueno espero que como siempre lo hayan disfrutado y como saben cualquier duda o consulta el blog esta a su entera dispocición.
No hay comentarios:
Publicar un comentario