Ir al contenido principal

Metodos para buscar en una lista

Cuando quieran encontrar elementos en una lista de objetos pueden usar ciclos, aunque es mejor utilizar los metodos búsqueda Find, FindAll,  Exists e IndexOf.

Obtener el elemento con Find

En lugar de utilizar un bucle foreach con un if , se puede utilizar el método Find en la lista.  Devuelve el primer objeto encontrado..
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> list = new List<int>(new int[] { 19, 23, 29 });

        // Encuentra el primer elemento mayor a 20
        int result = list.Find(item => item > 20);

        Console.WriteLine(result); // 23
    }
}
Descripción. Este código recorre cada valor int en la lista desde el principio y prueba cada valor para ver si es mayor a 20, y devuelve el primer valor encontrado (en este caso el numero 23). 
Un ejemplo mas completo:
Supongamos que tenemos la siguiente clase:
public class Employee{        public String EmpCode;    
    public String FirstName;    
    public String LastName; 
   
    public DateTime DateOfBirth;
    public String Department;
    public String Designation;
    //Constructor
    public Employee(String ecode, String fname, String lname, DateTime dob, String dept, String desg)
    {
         EmpCode = ecode;
         FirstName = fname;
         LastName = lname;
         DateOfBirth = dob;
         Department = dept;
         Designation = desg;    
    }
}
y tenemos una lista de objetos de tipo Employee...
public class EmployeeList : List<Employee>{ }  
en la cual agregamos los siguientes empleados...
EmployeeList elist = new EmployeeList();
elist.Add(new Employee("1","Ruben","Jacome",DateTime.Now,"Ingenieria de Manufactura","Programador"));
elist.Add(new Employee("2","Alejandra","Cruz",DateTime.Now,"Desarrollo de Software","Programador"));
elist.Add(new Employee("3","Mario","Gonzalez",DateTime.Now,"PCL","Supervisor"));
elist.Add(new Employee("4","Bob","Meyer",DateTime.Now,"Divisional","Gerente"));
y ahora buscamos a Bob...
Employee em = elist.Find(delegate(Employee e) { return e.FirstName == "Bob"; });
Ahora tendremos en em el objeto Employee que tenga el FirstName = "Bob".
Nota sobre las búsquedas hacia atras. Para buscar hacia atrás, utilice el método FindLast, que volvería a 29 en el ejemplo anterior. Analizará la lista desde el último elemento hasta el primero.
Buscar por otros métodos. También hay métodos FindIndex y FindLastIndex que se pueden utilizar para regresar el índice de los valores encontrados en la busqueda

Entendiendo FindAll

El método FindAll devuelve una lista de objetos del mismo tipo con todos los elementos que coinciden con la busqueda.

Utilizando Exists

El método Exists devuelve true o false dependiendo de si cualquier elemento coincide con el parámetro de busqueda.
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> list = new List<int>();
        list.Add(7);
        list.Add(11);
        list.Add(13);

        // Busca si existen valores mayores a 10
        bool exists = list.Exists(element => element > 10);
        Console.WriteLine(exists); // True

        // Busca por numeros menores a 7
        exists = list.Exists(element => element < 7);
        Console.WriteLine(exists); // False
    }
}
Descripción: En este ejemplo se prueba primero para ver si algun elemento de la lista tiene un valor mayor a 10, el cual regresa true. Despues, prueba por valores menores a 7, los cuales regresan false. 

Usando IndexOf

El método IndexOf tiene dos sobrecargas. Acepta el valor que desee encontrar como primer parámetro y, a continuación, devuelve la ubicación del valor en un arreglo.
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> primes = new List<int>(new int[] { 19, 23, 29 });

        int index = primes.IndexOf(23); // Existe en la lista
        Console.WriteLine(index);     // 1

        index = primes.IndexOf(10); // No existe en la lista
        Console.WriteLine(index); // -1
    }
}
NOTA. Cuando se utiliza IndexOf, siempre se debe comprobar -1 o se generara una excepcion. Tenga en cuenta que también puede usar LastIndexOf para realizar la búsqueda en el orden inverso.

Comentarios

Entradas más populares de este blog

Eliminar registros repetidos de una DataTable

A continuación les muestro un ejemplo de como eliminar los registros repetidos de una DataTable . //DataTable con los reqistros repetidos (myRepeatedData) //Filtramos los registros únicos en la variable var. var uniqueRows = myRepeatedData.AsEnumerable().Distinct(DataRowComparer.Default); //Lo copiamos a otra DataTable DataTable myUniqueData = uniqueRows.CopyToDataTable(); Con esto tendremos en la DataTable myUniqueData los registros únicos.

Obtener el valor de un control ASPxSpinEdit dentro de un ASPxGridView

Para obtener el valor de un control ASPxSpinEdit dentro de un ASPxGridView -Agregar un control ASPxSpinEdit dentro del DataItem Template -Hacer que se muestren los datos de la fuente poniendo en el atributo value la expressión siguiente: ' <%# Bind("GroupCode") %> '  donde GroupCode es el nombre de la columna en la fuente de datos. -Hacer que el evento ValueChanged se procese en el servidor agregando lo siguiente en los eventos del cliente:   <ClientSideEvents ValueChanged="function(s, e) {  e.processOnServer = true; }" /> El markup completo de la columna quedaría así: <dx:GridViewDataTextColumn Caption="Grupo" FieldName="GroupCode" ShowInCustomizationForm="True" VisibleIndex="4">    <PropertiesTextEdit DisplayFormatInEditMode="True" DisplayFormatString="g">    </PropertiesTextEdit>    <DataItemTemplate>       <dx:ASPxSpinEdit ID="spinEdi...

Mostrar un Loading Panel al cargar y al procesar los datos que consuman mucho tiempo de proceso

Primero hay que crear el Panel como en el siguiente ejemplo: <dx:ASPxLoadingPanel ID="loadingPanel" ClientInstanceName="loadingPanel" runat="server" Modal="true"         Width="70%" Height="30px" Text="Se está procesando su petición; por favor no abandone la sesión porque podría tener inconsistencia en sus datos..." >     </dx:ASPxLoadingPanel> Crear una función con Javascript que muestre el panel :  function showLoadingPanel() {         loadingPanel.Show();     } Si se desea que solo muestre el panel encima de un control como el ASPxGridview se puede usar el método ShowInElementByID del Panel: function showLoadingPanel() {         loadingPanel.ShowInElementByID(grvHarnessItems.name);     } Crear una función con Javascript que esconda el panel:   function OnControlsInitialized(s, e) {         setTimeout(function () {   ...