Emmanuel Chomarat
J'ai récemment dû comparer des objets de la même classe mais venant de deux sources de données différentes (DB Prod / Int, différents fichiers, etc.). Je ne voulais voir que les objets qui avaient une différence et si possible la détecter rapidement. Grâce à LINQPad j'avais tous les outils nécessaires et j'avais mon résultat en quelques minutes.
Voici un snippet vous montrant l'utilisation de la méthode Util.Dif
:
void Main()
{
var int_source = new List<Klass>
{
new Klass { Id = 1, First = "E", Last = "C" },
new Klass { Id = 2, First = "J", Last = "C" },
new Klass { Id = 3, First = "S", Last = "J" },
};
var prod_source = new List<Klass>
{
new Klass { Id = 1, First = "E", Last = "C" },
new Klass { Id = 2, First = "J", Last = "C" },
new Klass { Id = 3, First = "S", Last = "C" },
};
foreach (var element in prod_source.Zip(int_source, (f, s) => (f, s)))
{
if (!Util.Dif(element.f, element.s).IsSame)
{
Util.Dif(element.f, element.s).Dump("Full");
Util.Dif(element.f, element.s, hideMatchingMembers: true).Dump("Only Diff");
}
}
}
// Define other methods and classes here
class Klass
{
public int Id { get; set; }
public string First { get; set; }
public string Last { get; set; }
}
Cette méthode renvoie un objet IUtilDifResult qui contient une méthode IsSame
pour tester l'égalité de deux objets. Petit plus, vous voyez que j'utilise la méthode Zip qui me permet d'avoir une approche Linq sans utiliser les boucles for
du C.
Cette méthode Util.Dif
permet également de comparer des objets imbriqués en contrôlant le niveau grâce au paramètre depth
.
C'est simple, c'est rapide et c'est tout ce dont j'avais besoin. Job done!
Voici le résultat dans Linqpad:
Si vous aimez nos articles et voulez plus de tips sur LINQPad faites le savoir sur Twitter