Articles
Le Comparateur de Collections, Trouver les Différences Entre Deux Collections
22 juillet 2019 • 2 min de lecture

Avez-vous déjà eu à comparer deux collections et exécuter une logique basée sur le fait que l’élément soit dans la collection source, dans la collection de comparaison ou dans les deux ? Oui, moi aussi, j’avais besoin de fusionner des données de l’interface utilisateur et de la base de données. Je n’ai pas trouvé de bonne solution, alors j’ai écrit un comparateur de collections.
Pour illustrer comment cela fonctionne, regardons un exemple.
Dans les données source, nous avons les valeurs 1, 3, 4, 6, et dans la
collection de comparaison, nous avons les valeurs 1, 2, 3, 4, 5.
Il manque le 2 et le 5 dans les données source par rapport à la collection de comparaison, et il manque le 6 dans la collection de comparaison par rapport à la collection source.
Parcourons cette fusion :
- dans les deux (mise à jour)
- seulement dans la collection de comparaison (ajouter à la source)
- dans les deux (mise à jour)
- dans les deux (mise à jour)
- seulement dans la collection de comparaison (ajouter à la source)
- seulement dans la collection source (supprimer de la source)
Voici à quoi ressemble le code :
var source = new []{1, 3, 4, 6};
var collection = new[] {1, 2, 3, 4, 5};
source.CompareTo(collection, (s, d) => s == d)
.OnlyInSourceCollection(s=> {/* faire quelque chose */})
.OnlyInComparingCollection(s=>{/* faire quelque chose */})
.InBoth(s=> {/*faire quelque chose*/})
.Process();
Pourquoi ne pas utiliser LINQ ?
Vous pouvez utiliser LINQ, cependant, LINQ itérera les collections au moins 3 fois, ce qui n’inclut pas les opérations (ajout, mise à jour et suppression) sur les données. En utilisant le CollectionComparer
, les données ne sont itérées que deux fois.
Il existe des moyens plus rapides de trouver les différences comme une recherche binaire, mais une recherche binaire ne fonctionne qu’avec des entiers. Le comparateur de collections prend en charge tout type de comparaison. La comparaison est définie avec ce code : (s, d) => s == d
.
Le code source se trouve sur GitHub.
Auteur : Chuck Conway se spécialise dans l’ingénierie logicielle et l’IA générative. Connectez-vous avec lui sur les réseaux sociaux : X (@chuckconway) ou visitez-le sur YouTube.