How to sort list with complex object by one of its properties?

15

I have a list of objects and I want to sort the list by one of the properties (Desc of string type), how do I do this?

public class Foo
{
    public string Desc { get; set; }

    // Várias outras propriedades
}

public class Program
{
    static void Main()
    {
        List<Foo> objetos = Program.PreencheObjetos();

        objetos.Sort();
    }

    public static List<Foo> PreencheObjetos()
    {
        // Retorna uma lista preenchida.
    }
}

I could not use Sort to do this.

    
asked by anonymous 10.02.2014 / 18:16

5 answers

8

You can work with sorting by using the List<T>.Sort(IComparer <T>) method (documentation at MSDN ) by implementing the IComparer interface (documentation on MSDN ) in the object classes you want to sort. Here's how:

In the object class

public class ComparadorDoMeuObjeto: IComparer<MeuObjeto>  {
    int IComparer.Compare( MeuObjeto x, MeuObjeto y )  {
        if(x == null)
            return -1;
        if(y == null)
            return 1;

        return x.PropriedadeInterna - y.PropriedadeInterna ;
    }
}

See how to implement

+-------------------+--------------------+ 
| Valor             | Significado        | 
+-------------------+--------------------+ 
| menor que zero    | x é menor do que y | 
| zero              | x é igual a y      | 
| maior do que zero | x é maior do que y | 
+-------------------+--------------------+ 

How to sort

 List<MeuObjeto> objs= new List<MeuObjeto>();
 objs.Add(new MeuObjeto(1));
 objs.Add(new MeuObjeto(2));
 objs.Add(new MeuObjeto(3));
 objs.Add(new MeuObjeto(4));

 ComparadorDoMeuObjeto comparador = new ComparadorDoMeuObjeto();

 // Com objeto IComparer
 objs.Sort(comparador);
 // Com Lambda para fazer a mesma coisa (parâmetros do IComparer)
 objs.Sort((x, y) => x.PropriedadeInterna  - y.PropriedadeInterna);
    
10.02.2014 / 18:39
10

You can use linq for this:

objetos = objetos.OrderBy(o => o.Desc).ToList();

or passing a function in .Sort ()

objetos.Sort((o1,o2) => o1.Desc.CompareTo(o2.Desc));
    
10.02.2014 / 18:21
3

Try using Linq:

    var objetosEmOrdem = (from o in objetos
                          orderby o.Desc
                          select s);
    
10.02.2014 / 18:19
2

Use the Sort method by passing a Comparison<T> delegate.

objetos.Sort((x, y) => x.Desc.CompareTo(y.Desc));

link

    
10.02.2014 / 18:27
1

See if this is what you want

public class Foo
{
    public int Codigo { get; set; }
    public string Nome { get; set; }
    public string Sobrenome { get; set; }

    // Várias outras propriedades
}

public class Program
{
    static void Main()
    {
        List<Foo> objetos = Program.PreencheObjetos();

        objetos.OrderBy(a => a.Nome);
        objetos.OrderBy(a => a.Codigo);
        objetos.OrderBy(a => a.Sobrenome);

        objetos.OrderByDescending(a => a.Nome);
        objetos.OrderByDescending(a => a.Codigo);
        objetos.OrderByDescending(a => a.Sobrenome);
    }

    public static List<Foo> PreencheObjetos()
    {
        List<Foo> list = new List<Foo>();
        for (int i = 0; i < 10; i++)
        {
            list.Add(new Foo() { Codigo = i, Nome = "Nome " + i, Sobrenome = "Sobrenome " + i });

        }

        return list;

    }
}
    
10.02.2014 / 18:34