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 PaoniSuponhamos 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!