Skip to content

Posts

O Comparador de Coleções, Encontrando as Diferenças Entre Duas Coleções

22 de julho de 2019 • 2 min de leitura

O Comparador de Coleções, Encontrando as Diferenças Entre Duas Coleções

Você já precisou comparar duas coleções e executar alguma lógica baseada em se o item está na coleção de origem, na coleção de comparação ou em ambas? Sim, eu também precisei, eu precisava mesclar dados da UI e do banco de dados. Não consegui encontrar uma boa solução, então escrevi um comparador de coleções.

Para ilustrar como isso funciona, vamos ver um exemplo.

Nos dados de origem temos os valores 1, 3, 4, 6, e na
coleção de comparação temos os valores 1, 2, 3, 4, 5.

Os dados de origem estão faltando o 2 e o 5 quando comparados com a coleção de comparação, e a coleção de comparação está faltando o 6 quando comparada com a coleção de origem.

Vamos percorrer essa mesclagem:

  1. em ambas (atualizar)
  2. apenas na coleção de comparação (adicionar à origem)
  3. em ambas (atualizar)
  4. em ambas (atualizar)
  5. apenas na coleção de comparação (adicionar à origem)
  6. apenas na coleção de origem (remover da origem)

Aqui está como o código se parece:

var source = new []{1, 3, 4, 6};
var collection = new[] {1, 2, 3, 4, 5};

source.CompareTo(collection, (s, d) => s == d)
    .OnlyInSourceCollection(s=> {/* do something */})
    .OnlyInComparingCollection(s=>{/* do something */})
    .InBoth(s=> {/*do something*/})
    .Process();

Por que não usar LINQ?

Você pode usar LINQ, porém, LINQ iterará as coleções pelo menos 3 vezes, o que não inclui operar (adicionar, atualizar e deletar) nos dados. Usando o CollectionComparer, os dados são iterados apenas duas vezes.

Existem formas mais rápidas de encontrar as diferenças, como uma busca binária, mas uma busca binária funciona apenas com inteiros. O comparador de coleções suporta qualquer tipo de comparação. A comparação é definida com este código: (s, d) => s == d.

O código-fonte está disponível no GitHub.

Autor: Chuck Conway é um Engenheiro de IA com quase 30 anos de experiência em engenharia de software. Ele constrói sistemas de IA práticos—pipelines de conteúdo, agentes de infraestrutura e ferramentas que resolvem problemas reais—e compartilha o que está aprendendo ao longo do caminho. Conecte-se com ele nas redes sociais: X (@chuckconway) ou visite-o no YouTube e no SubStack.

↑ Voltar ao topo

Você também pode gostar