Eduardo Spaki

Ordenação no List

Hoje um amigo me pediu algo para ordenar um List<> de acordo com a propriedade desejada de uma Lista de objetos, seja de qual Tipo for!
Basta utilizar a interface IComparer meu amigo... veja como fica:

(A classe de exemplo: Aluno.cs)
using System;

namespace Ordenacao
{
    class Aluno
    {
        public int Codigo { get; set; }
        public string Nome { get; set; }
        public decimal Nota { get; set; }
    }
}

(Enun de Ascendente/Descendente)
namespace Ordenacao
{
    enum OrdemOrdenacao
    {
        Ascendente,
        Descendente
    }
}

(Core: Ordenacao.cs)
using System;
using System.Collections.Generic;
using System.Reflection;

namespace Ordenacao
{
    class Ordenacao<T> : IComparer<T>
    {
        public string PropriedadeOrdenadora { get; set; }
        public OrdemOrdenacao Ordem { get; set; }

        public Ordenacao(OrdemOrdenacao ordem, string propriedadeOrdenadora)
        {
            Ordem = ordem;
            PropriedadeOrdenadora = propriedadeOrdenadora;
        }

        public int Compare(T x, T y)
        {
            PropertyInfo propriedade = typeof(T).GetProperty(PropriedadeOrdenadora);

            IComparable objX = (IComparable)propriedade.GetValue(x, null);
            IComparable objY = (IComparable)propriedade.GetValue(y, null);

            if (Ordem == OrdemOrdenacao.Ascendente)
                return (objX.CompareTo(objY));
            else
                return (objY.CompareTo(objX));
        }
    }
}

(Método main do console aplication)
using System;
using System.Collections.Generic;
using System.Text;

namespace Ordenacao
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Aluno> alunos = new List<Aluno>();

            alunos.Add(new Aluno() { Codigo = 50,  Nome = "Astoufo   ", Nota = 40.5M });
            alunos.Add(new Aluno() { Codigo = 2,   Nome = "Uésley    ", Nota = 63M   });
            alunos.Add(new Aluno() { Codigo = 23,  Nome = "Cleosvaldo", Nota = 72.5M });
            alunos.Add(new Aluno() { Codigo = 1,   Nome = "Perilson  ", Nota = 20M   });
            alunos.Add(new Aluno() { Codigo = 500, Nome = "Uilson    ", Nota = 63M  });

            EscreverLista(alunos, "Sem Ordem");

            // -> Código
            alunos.Sort(new Ordenacao<Aluno>(OrdemOrdenacao.Ascendente, "Codigo"));
            EscreverLista(alunos, "Codigo");

            // -> Nome
            alunos.Sort(new Ordenacao<Aluno>(OrdemOrdenacao.Ascendente, "Nome"));
            EscreverLista(alunos, "Nome");

            // -> Nota
            alunos.Sort(new Ordenacao<Aluno>(OrdemOrdenacao.Ascendente, "Nota"));
            EscreverLista(alunos, "Nota");

            Console.ReadKey();
        }

        static void EscreverLista(List<Aluno> alunos, string cabecalho)
        {
            Console.WriteLine(cabecalho);
            Console.WriteLine("--------------------------------");
            Console.WriteLine("Código\tNome     \tNota");
            Console.WriteLine("--------------------------------");

            foreach (Aluno aluno in alunos)
                Console.WriteLine(string.Format("{0}\t{1}\t{2:f}", aluno.Codigo, aluno.Nome, aluno.Nota));

            Console.WriteLine("--------------------------------\n");
        }
    }
}

(Resultado)
Resultado das ordenações

 

Download do Exemplo! 

...é isto daí pessoal, dúvidas... mandem-me e-mai! espero ter ajudado e até a próxima ;D

Comentários

Sem comentários