Método: Except
O amigo @VQuaiato fez um post bem interessante falando do método de extensão, que entrou na versão 3.0 do C#, para obter a diferença entre duas coleções.
Vamos pensar na seguinte solução: O usuário possui acesso a várias funcionalidades do sistema. Em uma página de manutenção, existem todos as funcionalidades listadas através de “checkbox + nome”, para que possamos marcar ou desmarcar as funcionalidades que o usuário terá acesso.
Simples. Já vi várias soluções fazendo o seguinte: (1) removendo todos as funcionalidades do usuário no banco de dados. (2) adicionando o que ficou selecionado na lista.
Como podemos resolver isso de uma forma mais adequada? Utilizando o método Except
Vamos ao código (utilizei a mesma lista do @vquaiato para este exemplo):
// Lista padrão apresentada para o usuário
var lista = new List<string> { "azul", "amarelo", "verde", "rosa" };
// Vamos supor que ele:
// Removeu o rosa e o amarelo
// Adicionou o cinza e o preto
var listaAtualizada = new List<string> { "azul", "verde", "cinza", "preto" };
// Recuperar apenas o que entrou na lista
var itensAdicionados = listaAtualizada.Except(lista);
// Recuperar apenas o que saiu da lista
var itensRemovidos = lista.Except(listaAtualizada);
Console.WriteLine("Itens Adicionados:");
foreach (var cor in itensAdicionados)
{
Console.WriteLine(cor);
}
Console.WriteLine("Itens Removidos:");
foreach (var cor in itensRemovidos)
{
Console.WriteLine(cor);
}
Resultado:
Itens Adicionados:
cinza
preto
Itens Removidos:
amarelo
rosa
Bem simples, não? Agora podemos fazer a ação em cima apenas dos itens que foram modificados.
abraços,
maio 19, 2010 at 10:49 pm
Excelente exemplo de uso Kenj… Parabéns!!!
Realmente, conhecer os recursos do framework nos possibilita alcançar resultados mais elegantes e menos complicados.
Dar um delete em tudo no banco é feio… além de alterar os Ids para coisas que já existem e serão readicionadas…
Abraços!!!
Vinicius Quaiato.
maio 20, 2010 at 12:22 am
Cara, isso é bom d+, o framework é gigantesco e nem sempre obtemos os melhores resultados por desconhecer métodos desse tipo, eu mesmo ja fiz isso de deletar todos os dados da tabela (rs..).
Parabéns ai Bruno e @VQuaiato.
Ivan Teles.
maio 20, 2010 at 1:34 am
Por isso, compartilhamos informações! Não dá pra abraçar o mundo. A troca de experiência entre profissionais é MEGA importante, como diria Luciano Huck, kwk.
maio 28, 2010 at 5:56 pm
Impressionante como é simples e útil Kenj.
Sempre há mais para descobrir em cima do .NET Framework. Gostei demais.
Gosto de artigos que complementam outros artigos.
Isto é comunidade, isto é troca de informações.
Parabéns pelo blog.
Está fantástico.