Skip to content

Publicaciones

El Comparador de Colecciones, Encontrando las Diferencias Entre Dos Colecciones

22 de julio de 2019 • 2 min de lectura

El Comparador de Colecciones, Encontrando las Diferencias Entre Dos Colecciones

¿Alguna vez has tenido que comparar dos colecciones y ejecutar lógica basada en si el elemento está en la colección de origen, en la colección de comparación o en ambas? Sí, yo también, necesitaba fusionar datos de la interfaz de usuario y la base de datos. No encontré una buena solución, así que escribí un comparador de colecciones.

Para ilustrar cómo funciona esto, veamos un ejemplo.

En los datos de origen tenemos los valores 1, 3, 4, 6, y en la
colección de comparación tenemos los valores 1, 2, 3, 4, 5.

Los datos de origen no tienen el 2 y el 5 cuando se comparan con la colección de comparación, y la colección de comparación no tiene el 6 cuando se compara con la colección de origen.

Veamos esta fusión paso a paso:

  1. en ambas (actualizar)
  2. solo en la colección de comparación (agregar a origen)
  3. en ambas (actualizar)
  4. en ambas (actualizar)
  5. solo en la colección de comparación (agregar a origen)
  6. solo en la colección de origen (eliminar de origen)

Así es como se ve el código:

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 qué no usar LINQ?

Puedes usar LINQ, sin embargo, LINQ iterará las colecciones al menos 3 veces, lo que no incluye operar (agregar, actualizar y eliminar) en los datos. Usando CollectionComparer, los datos se iteran solo dos veces.

Hay formas más rápidas de encontrar las diferencias, como una búsqueda binaria, pero una búsqueda binaria solo funciona con números enteros. El comparador de colecciones admite cualquier tipo de comparación. La comparación se define con este código: (s, d) => s == d.

El código fuente se encuentra en GitHub.

Autor: Chuck Conway es un Ingeniero de IA con casi 30 años de experiencia en ingeniería de software. Construye sistemas de IA prácticos—canalizaciones de contenido, agentes de infraestructura y herramientas que resuelven problemas reales—y comparte lo que está aprendiendo en el camino. Conéctate con él en redes sociales: X (@chuckconway) o visítalo en YouTube y en SubStack.

↑ Volver arriba

También te puede interesar