none
Ordenamiento de listas RRS feed

  • Pregunta

  • Buenos dias a todos !!

    Me encuentro con el siguiente problema. Necesito hacer un metodo que reciba una lista (la clase de esta lista va a variar) y 2 parametros (estos parametros son el campo y el sentido de ordenamiento). O sea, necesito un metodo general para ordenar listas genericas.

    Intente hacerlo mediante la declaracion List<T> tanto en la devolucion del metodo como en el parametro de entrada, pero me obliga a declarar el tipo de clase que es la lista al llamar al metodo.

    Esto es lo que tengo implementado en la vista y funciona:

    public ActionResult Index(string campo, string orden)
            {
                List<Destinos> destinos = new List<Destinos>();
                destinos = Utils.cargaDestinos();
    
                if (campo != null && orden != null)
                {
                    var propertyInfo = typeof(Destinos).GetProperty(campo);
                    List<Destinos> destord = new List<Destinos>();
    
                    if (orden == "ASC")
                    {
                        destord = destinos.OrderBy(x => propertyInfo.GetValue(x, null)).ToList();
                    }
                    else
                    {
                        destord = destinos.OrderByDescending(x => propertyInfo.GetValue(x, null)).ToList();
                    }
                }
                return View(destord);
            } 


    Como puedo hacer el metodo para que pueda llamarlo de una forma asi, teniendo en cuenta que "lista" puede ser de cualquier clase:

    var listaOrdenada = OrdenarLista(lista, campo, orden);

    Muchas Gracias !

    lunes, 10 de septiembre de 2018 11:30

Respuestas

  • El truco esta en poner <T> en el nombre del metodo:

    public List<T> OrdenarLista<T>(List<T> lista, string campo, string orden);
    {
              List<T> destord = null;
              if (campo != null && orden != null)
              {
                    var propertyInfo = typeof(T).GetProperty(campo);
                    
                    if (orden == "ASC")
                    {
                        destord = lista.OrderBy(x => propertyInfo.GetValue(x, null)).ToList();
                    }
                    else
                    {
                        destord = lista.OrderByDescending(x => propertyInfo.GetValue(x, null)).ToList();
                    }
              }
    
              return destord;
    }  

    lunes, 10 de septiembre de 2018 12:01
    Moderador

Todas las respuestas

  • El truco esta en poner <T> en el nombre del metodo:

    public List<T> OrdenarLista<T>(List<T> lista, string campo, string orden);
    {
              List<T> destord = null;
              if (campo != null && orden != null)
              {
                    var propertyInfo = typeof(T).GetProperty(campo);
                    
                    if (orden == "ASC")
                    {
                        destord = lista.OrderBy(x => propertyInfo.GetValue(x, null)).ToList();
                    }
                    else
                    {
                        destord = lista.OrderByDescending(x => propertyInfo.GetValue(x, null)).ToList();
                    }
              }
    
              return destord;
    }  

    lunes, 10 de septiembre de 2018 12:01
    Moderador
  • El truco esta en poner <T> en el nombre del metodo:

    public List<T> OrdenarLista<T>(List<T> lista, string campo, string orden);
    {
              List<T> destord = null;
              if (campo != null && orden != null)
              {
                    var propertyInfo = typeof(T).GetProperty(campo);
                    
                    if (orden == "ASC")
                    {
                        destord = lista.OrderBy(x => propertyInfo.GetValue(x, null)).ToList();
                    }
                    else
                    {
                        destord = lista.OrderByDescending(x => propertyInfo.GetValue(x, null)).ToList();
                    }
              }
    
              return destord;
    }  

    Muchas gracias Jorge, voy a probarlo y cualquier cosa te comento los resultados !!!

    viernes, 14 de septiembre de 2018 13:16