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á teve que 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 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 à coleção de comparação, e a coleção de comparação está faltando o 6 quando comparada aos dados de origem.

Vamos percorrer esta 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 fica:

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

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

Por que não usar LINQ?

Você pode usar LINQ, no entanto, LINQ irá 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 maneiras mais rápidas de encontrar as diferenças, como uma busca binária, mas uma busca binária só funciona 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 é especialista em engenharia de software e IA Generativa. Conecte-se com ele nas redes sociais: X (@chuckconway) ou visite-o no YouTube.

↑ Voltar ao topo

Você também pode gostar