10.18.2008

Buscando Elementos dentro de una Lista Generica - List.FindIndex

En el post anterior, trabajamos con el método List<T>.FindAll, el cual se encarga de obtener todos los elementos que concuerdan con un predicado definido por el usuario para comparar. En esta oportunidad vamos a trabajar con el método FindIndex de una lista genérica.

De acuerdo al msdn, el método FindIndex busca un elemento que cumpla con las condiciones especificadas por un predicado, y retorna el índice en la lista de la primera ocurrencia. Este índice inicia en 0 para el primer elemento y termina en el largo de la lista – 1 para el último elemento.

En este ejemplo vamos a buscar a la primera persona que vive en Costa Rica, y para tal fin vamos a utilizar la clase persona utilizada en el post anterior, y vamos a utilizar la lista cargada con los mismos datos del mismo post. Es importante recordar que esta aplicación de ejemplo, es una aplicación de consola.

Para iniciar, tenemos que crear un método que nos devuelva verdadero si la persona que viene por parámetro vive en Costa Rica o no. Este método será utilizado como predicado para buscar el elemento deseado dentro de la lista. Además, este método se va a invocar una vez por cada elemento dentro de la lista hasta que se encuentre el elemento buscado o hasta que finalice la lista. El método se muestra a continuación:

static bool viveEnCostaRica( Persona persona )
{
if (persona.Pais == "Costa Rica")
return true;
return false;
}


El siguiente método, es un método que busca el primer elemento que contenga como país “Costa Rica”, por lo tanto invoca el método FindIndex una vez con el método anterior como predicado.



static int IndicePrimeraPersonaQueViveEnCostaRica( List<Persona> listaPersonas )
{
int indice = listaPersonas.FindIndex(viveEnCostaRica);
return indice;
}


Por último, invocamos el método IndicePrimeraPersonaQueViveEnCostaRica y desplegamos en la consola el índice de la primera persona encontrada. Se debe destacar que si no se encuentra ninguna persona que cumpla con la condición establecida, el índice retornado es –1.



Console.WriteLine("Índice de la Primera Persona Encontrada de Costa Rica");
Console.WriteLine("------------------------------");
Console.WriteLine("Ínidice: {0} ", IndicePrimeraPersonaQueViveEnCostaRica(listaPersonas));



El resultado se puede ver en la siguiente figura.



image

2 comentarios:

Anónimo dijo...

Hola, y como seria si quiero buscar otro pais? deberia crear un predicado por cada pais? no lo creo asi. ¿Como podria hacer un predicado que me permita pasarle como parametro el pais con el cual quiero compararlo? Gracias!

Diego Rojas dijo...

Hola y gracias por leer mi blog. La forma más simple es tener una propiedad a nivel de clase y setearla antes de invocar el delegate, luego usar esa propiedad en la comparación.
Saludos!