Desenvolvimento - C#

Explorando alguns Delegates do C# 2.0: Predicates, Converter, Comparison e Action

Explore nesse artigo alguns Delegates do C# 2.0: Predicates, Converter, Comparison e Action.

por Rodolfo Paoni



Suponhamos que há no nosso projeto uma lista de um classe Usuario e que queremos realizar várias operações nesta classe, como busca, ordenação, converção e algumas outras ações, mas com poucas linhas de código. Desde o C# 2.0 temos alguns delegates poderosíssimos incluídos na linguagem. Mostrarei um exemplo com cada um deles:

Entidade utilizada nos exemplos:

public class Usuario
{
public string Nome
{
get;
set;
}

public string Endereco
{
get;
set;
}
}

OBS.: Esta entidade utiliza-se de Automatic Properties, recurso disponível no C# 3.0, mas todos os delegates apresentados em seguida funcionam no C# 2.0.

Predicates

Utilizamos Predicates para realizar buscas em coleções, de uma maneira bem simples:

private static bool Search(Usuario user)
{
return user.Nome.Equals("Rodolfo");
}

static void Main(string[] args)
{

List<Usuario> users = new List<Usuario> ();

Usuario u1 = new Usuario();
u1.Nome = "Rodolfo";
u1.Endereco = "Minha Rua";

Usuario u2 = new Usuario();
u2.Nome = "Rodrigo";
u2.Endereco = "Outra Rua";

users.Add(u1);
users.Add(u2);

//Predicates
Usuario busca = users.Find(new Predicate<Usuario>(Search));
if (busca != null)
Console.WriteLine(busca.Nome);

//Utilizando Predicates e Métodos anônimos - Inline
Usuario b1 = users.Find(new Predicate<Usuario>(delegate(Usuario user)
{
return user.Nome.Equals("Anna");
}));

if (b1 != null)
Console.WriteLine(b1.Nome);
}

Converter

Seguindo esta mesma idéia de simplicidade, com a opção de utilizarmos um método externo ou Inline (anônimo), podemos converter uma "List<Usuario>" em uma "List<string>":

private static string Conversao(Usuario user)
{
return user.Nome;
}

List<string> nomes = users.ConvertAll<string>(new Converter<Usuario, string>(Conversao));

//Utilizando métodos anônimos - Inline
List<string> nomes = users.ConvertAll<string>(new Converter<Usuario, string>(delegate(Usuario user)
{
return user.Nome;
}));

Comparison

Para odernarmos uma coleção, esta coleção precisa implementar IComparable ou criarmos uma classe externa que implemente IComparer para realizar esta operação. Na 1ª opção, precisamos ter acesso ao código fonte e na 2ª, precisamos criar uma classe separada. Como resolver isto em poucas linhas e sem ter todo este trabalho?

//Comparasion
//Utilizando métodos anônimos - Inline
nomes.Sort(new Comparison<string>(delegate(string u1, string u2)
{
return Comparer<string>.Default.Compare(u1, u2);
}));

Da mesma forma que nos exemplos anteriores, poderíamos ter utilizado um método externo para realizar a ordenação.

Action

Como eu posos realizar alguma ação em uma lista seem precisar criar um método externo e com poucas linhas?

//Utilizando métodos anônimos - Inline
nomes.ForEach(new Action<string>(delegate(string nome)
{
Console.WriteLine(nome);
}));

Até a próxima!

Rodolfo Paoni

Rodolfo Paoni - Rodolfo Paoni - Desenvolvedor .NET - Twitter: @rodolfopaoni