Como usar predicados para buscar en colecciones
En ciertas ocasiones en las que desarrollamos en C# y usamos colecciones genéricas para contener objetos de cierto tipo, una de las partes que parecen más complicadas es hacer la búsqueda de algún item en específico, pues si echamos un vistazo en la documentación tenemos un método llamado Find sin embargo nos pide un objeto de tipo Predicate.
Mmhh y que son los predicados?, los predicados explicados de una manera sencilla no son más que delegados que evalúan el criterio de búsqueda y regresan un valor booleano.
En base a esto podemos hacer uso del método Find pasándole como parámetro un predicado ó método anónimo.
En seguida mostraré un ejemplo en el que usaré ambos puntos de vista.
Comenzaremos por definir la clase que nos servirá como entidad:
View CodeCSHARP | |
5 6 7 8 9 10 | public class Person { public String name; public float height; public float weight; } |
Creamos la lista, inicializamos los objetos y los agregamos a la lista:
View CodeCSHARP | |
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | private static List<Person> persons = new List<Person>(); public static void Main(String[] args) { Person person; person = new Person(); person.name = "Julio"; person.height = 1.65F; person.weight = 62.0F; persons.Add(person); person = new Person(); person.name = "Carlos"; person.height = 1.75F; person.weight = 67.0F; persons.Add(person); |
Generamos el método que actuará como predicado de nuestra búsqueda:
View CodeCSHARP | |
39 40 41 42 | private static bool IsInList(Person person) { return (person.name == "Carlos"); } |
Y por último usamos dicho predicado:
View CodeCSHARP | |
33 34 35 36 | person = null; person = persons.Find(new Predicate<Person>(IsInList)); Console.WriteLine(person.height); |
El resultado que obtendremos es 1.75, que es la estatura de Carlos.
Esta implementación es usando un predicado como método de búsqueda, a continuación les mostraré como usar un método anónimo en lugar del predicado.
Como? simple, modificamos la línea 35 de la clase por esta otra:
View CodeCSHARP | |
35 | person = persons.Find(delegate(Person p){return p.name == "Carlos";}); |
Listo!!!!!, obtendremos los mismos resultados, así que decidan que método es el que más se ajusta a sus necesidades ;).
A continuación les muestro el listado del programa completo, este programa fué probado tanto en Mono 1.9.1 como en el .Net Framework 2.0, con VS2005.
Downloadpredicatedelegatespike.cs | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | using System; using System.IO; using System.Collections.Generic; public class Person { public String name; public float height; public float weight; } public class PredicateDelegateSpike { private static List<Person> persons = new List<Person>(); public static void Main(String[] args) { Person person; person = new Person(); person.name = "Julio"; person.height = 1.65F; person.weight = 62.0F; persons.Add(person); person = new Person(); person.name = "Carlos"; person.height = 1.75F; person.weight = 67.0F; persons.Add(person); person = null; person = persons.Find(new Predicate<Person>(IsInList)); //person = persons.Find(delegate(Person p){return p.name == "Carlos";}); Console.WriteLine(person.height); } private static bool IsInList(Person person) { return (person.name == "Carlos"); } } |
Suerte en sus búsquedas :D.
| Related posts1 Comment so far
Leave a reply


Suscribete por correo
Y si en vez de carlos fuera un parámetro??? cómo quedaría el código??.