9
votes

c # comparer les données dans deux modèles d'objets

J'ai une boîte de dialogue, lorsque cela s'est engagé, il est renseigné avec les données dans un modèle d'objet. À ce stade, les données sont copiées et stockées dans un modèle d'objet "sauvegarde". Lorsque l'utilisateur a fini de faire leurs modifications, puis cliquez sur "OK" pour rejeter la boîte de dialogue, j'ai besoin d'un moyen rapide de comparer le modèle d'objet de sauvegarde avec le fichier en direct - si quelque chose est modifié, je peux créer un nouvel état d'annulation. < / p>

Je ne veux pas avoir à aller et écrire une fonction de comparaison pour chaque classe dans le modèle d'objet si possible.

Si je serai sérialisé les deux modèles d'objets et qu'ils étaient identiques mais stockés dans différents emplacements de mémoire seraient égaux? Existe-t-il un moyen simple de comparer deux modèles d'objets sérialisés?


8 commentaires

Pourriez-vous fournir plus de détails sur les technologies que vous utilisez. Utilisez-vous WPF, WinForms ou Silverlight? Il existe un moyen très facile de le faire avec un cadre d'entité ou des services de WCF RIA.


Salut Andrew - J'utilise .NET 3.5 et WPF avec C # Express 2008


Utilisez-vous un cadre d'entité, POCO ou autre chose?


Non, je n'ai pas entendu parler de celles-là.


Ensuite, je suppose que vous utilisez Poco (OLD-CLR-CLR-OBJETS). Je pense que votre idée peut fonctionner - simplement les sérialiser, alors peut-être que la chaîne de la chaîne, et la comparaison des hachages entre deux modèles d'objets. Je ne peux pas garantir que cela fonctionnerait de manière fiable, mais je pense qu'il serait utile d'enquêter!


Ouais j'utilise certainement des objets CLR de Vanilla. Alors, la main sur une seconde, je peux sérialiser un objet à une chaîne de hachage?


Eh bien, d'abord sérialiser l'objet, puis calculez un hachage des données sérialisées. N'oubliez pas que le hash ne sera pas unique - il pourrait y avoir deux modèles d'objet différents qui ont atteint la même valeur, bien que je pense que cela est plutôt improbable.


mal donner une bash, quel est le pire qui puisse arriver. Malade post ici si cela fonctionne


3 Réponses :


6
votes

Je dirais que le meilleur moyen est de mettre en œuvre les opérateurs d'égalité sur toutes les classes de votre modèle (qui est généralement une bonne idée de toute façon si vous allez faire des comparaisons).

Book book1 = new Book();
Book book2 = new Book();

book1.Title = "A book!";
book2.Title = "A book!";

bool equality = book1.Equals(book2); // returns true

book2.Title = "A different Title";
equality = book1.Equals(book2); // returns false


2 commentaires

Cela répond à la question de "Comment puis-je comparer deux objets pour l'égalité" IM après un moyen rapide et facile de comparer un modèle d'objet entier, sans écrire le code de comparaison sur chaque classe.


Comme suggéré, Reshaper facilite la génération de ces comparaisons. Jetbrains.com/help/resharper/2016.2/...



2
votes

Je comprends votre question comme comment on peut comparer deux objets pour l'égalité de valeur (par opposition à l'égalité de référence) sans une connaissance préalable des types, tels que s'ils mettent en œuvre IEQUATILABLE OU EQUIPAUX.

Pour ce faire. Deux options:

a. Utilisez une classe de sérialisation entièrement utilisée pour sérialiser les deux objets et comparer leur valeur. Par exemple, j'ai une classe appelée XMLSerializer qui prend un objet et sérialise ses propriétés publiques en tant que document XML. Deux objets qui ont les mêmes valeurs et éventuellement la même référence auront les mêmes valeurs dans ce sens.

b. Utilisation de la réflexion, comparez les valeurs de toutes les propriétés des deux objets, telles que: xxx

ici, nous supposons que nous pouvons facilement comparer les propriétés, comme si elles s'appliquent tous Iconvertible ou remplacer correctement la totring. Si ce n'est pas le cas, je vérifierais si elles implémentaient iconvertibles et si non, appelez de manière récursive égale () sur les propriétés.

Cela ne fonctionne que si vous êtes content de comparer les propriétés publiques. Bien sûr, vous pouvez également vérifier les champs et les propriétés privés et protégés également, mais si vous savez si peu de choses sur les objets que vous demandez probablement des ennuis, mais ce faisant.


1 commentaires

Merci pour l'information, j'ai pensé à utiliser la réflexion mais je voulais mettre clairement l'accent sur ne pas avoir à écrire beaucoup de code de comparaison. De plus, il doit probablement être extensible lorsque les exigences changent et je dois ajouter de nouveaux objets (ou quelqu'un d'autre le fait): s



11
votes

Je ne me suis pas dérangé avec une chaîne de hachage, mais une sérialisement binaire droit traverse des merveilles. Lorsque la boîte de dialogue s'ouvre sérialisée, le modèle d'objet. xxx

puis si l'utilisateur ajoute au modèle d'objet à l'aide de commandes disponibles (ou non). Lorsque la boîte de dialogue ferme vous pouvez comparer à la sérialisation originale avec une nouvelle - ceci pour moi est la manière dont je décide si un état d'annulation est requis ou non. xxx

et le comparateur Les tableaux Fonction incase quiconque a besoin d'elle - probablement pas la meilleure façon de comparer deux matrices im sûr. xxx


1 commentaires

Pourquoi ne pas simplement sérialiser les tableaux et comparer les cordes / octets? S'ils sont identiques, leur sérialisation ne donne-t-elle pas la même chose?