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 recuperar apenas o que entrou de novo e o que foi removido da lista, sem a necessidade de remover do banco de dados o que não foi mexido.

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,

4 Responses to “Método: Except

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Leave a Reply