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)

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