Cada vez que utilizamos listas en nuestras aplicaciones existe una altísima probabilidad de tengamos que recorrer la lista para llevar a cabo una acción específica sobre cada uno de los elementos contenidos en la misma. Esta acción se realiza normalmente utilizando la estructura for each o un for tradicional estilo “C++”. Sin embargo; en .NET las listas tienen otra forma de recorrer todos sus elementos y es utilizando el método Lista.ForEach( accion ). Este método me permite definir un delegate genérico para el método y asignarlo como acción, con lo cual cada elemento contenido en la lista es enviado como parámetro al delegate y se ejecuta el método; en otras palabras, el método se ejecuta una vez por cada elemento en la lista.
Ejemplo
Como siempre, para acompañar la teoría vamos a agregar un ejemplo. Supongamos que tenemos una lista de personas y otra lista de personas aprobadas; además, la lista de personas aprobadas solo se puede llenar con las personas que sean mayores de 18 años. Para esto primero vamos a crear una clase persona.
- public class Persona
- {
- public int Id { get; set; }
- public string Nombre { get; set; }
- public int Edad { get; set; }
- }
El siguiente paso es crear dos variables a nivel de clase – estáticas para no agrandar demasiado el ejemplo – y pertenecientes a la clase program.
- class Program
- {
- static List<Persona> _solicitantes = new List<Persona>();
- static List<Persona> _aprobados = new List<Persona>();
Luego procedemos a agregar unas cuantas personas a la lista de solicitantes.
- static void Main(string[] args)
- {
- Persona p0 = new Persona
- {
- Id = 1,
- Nombre = "Estela",
- Edad = 18
- };
- Persona p1 = new Persona {
- Id = 2,
- Nombre = "Luis",
- Edad = 25
- };
- Persona p2 = new Persona
- {
- Id = 3,
- Nombre = "Erick",
- Edad = 17
- };
- Persona p3 = new Persona
- {
- Id = 4,
- Nombre = "Carlos",
- Edad = 35
- };
- Persona p4 = new Persona
- {
- Id = 5,
- Nombre = "Ana",
- Edad = 16
- };
- _solicitantes.Add(p0);
- _solicitantes.Add(p1);
- _solicitantes.Add(p2);
- _solicitantes.Add(p3);
- _solicitantes.Add(p4);
Como podemos ver, ahora tenemos un par de personas que no tienen los 18 años. Ahora vamos a proceder a recorrer la lista y verificar cual persona es mayor de 18 años para agregarla a lista de aprobados, para esto primero tenemos que crear el delegate que hará el procesamiento.
- private static void ProcesarSolicitante(Persona pActual)
- {
- if (pActual.Edad > 17)
- {
- _aprobados.Add(pActual);
- }
- }
Ahora, para imprimir la lista, también voy a utilizar un delegate, tal y como se presenta en el siguiente “code snippet”.
- private static void ImprimirPersona(Persona pActual)
- {
- Console.WriteLine("Id: {0}\nNombre: {1},\nEdad: {2}",
- pActual.Id.ToString(), pActual.Nombre, pActual.Edad.ToString());
- }
Ahora en el método Main, después de agregar la última persona procedemos a invocar el método ForEach de la lista de solicitantes y le asignamos el delegate ProcesarSolicitante.
- _solicitantes.ForEach(ProcesarSolicitante);
Luego de esto procedemos a imprimir la lista de aprobados.
- Console.WriteLine("Usuarios Aceptados");
- Console.WriteLine("------------------");
- _aprobados.ForEach(ImprimirPersona);
Al ejecutar el código, podemos ver que en la lista de aprobados solamente aparecen las personas mayores de 17 años.
5 comentarios:
Amigo, muy buen post.
Pero tengo una duda: ¿en vez de utilizar un delegate, no se puede usar Lambda?
Hola JPCP. Gracias por el comentario. Si, de hecho hace un tiempo atrás hice un post para sustituir un delegate por una expresión Lambda. Aqui esta el link :)
http://icomparable.blogspot.com/2009/10/expresiones-lambda-en-vbnet-90.html
Con esto podes modificar la cantidad de items dentro de la lista y seguir recorriendola?
Porque estoy teniendo problemas con mi codigo y la exception dice "Colección modificada; puede que no se ejecute la operación de enumeración."
Como seria el codigo de este ejemplo en c# usando una expresion lambda?
no me sirvio de nada busca como recorrer una lista :/
Publicar un comentario