获取两个相同对象之间的差异列表的最佳方法
我想生成同一对象的2个实例之间的差异列表。有问题的对象:
public class Step { [DataMember] public StepInstanceInfo InstanceInfo { get; set; } [DataMember] public Collection<string> AdHocRules { get; set; } [DataMember] public Collection<StepDoc> StepDocs {...} [DataMember] public Collection<StepUsers> StepUsers {...} }
我想做的是找到一种返回对象的智能方法,该对象列出了两个实例之间的差异(例如,让我知道添加了2个特定的StepDocs,删除了1个特定的StepUser,并且从"转到"停止")。我一直在研究使用MD5哈希,但是找不到任何遍历这样的对象并返回特定差异的清单的良好示例(不仅仅是表明它们是不同的)。
其他背景:我需要执行此操作的原因是我支持的API允许客户端进行SaveStep(Step步骤)...这非常适合使用实体和存储库将Step对象持久保存到db。但是,我需要从此SaveStep方法引发特定事件(例如,添加了此用户等),以便提醒另一个系统(工作流引擎)该步骤中的特定元素已更改。
谢谢你。
解决方案
回答
在对象中实现IComparable接口可以为我们提供所需的功能。这将为我们提供一种自定义的方法来确定对象之间的差异,而无需求助于校验和,这实际上不会跟踪可用术语中的差异。否则,无法确定我所知道的.NET中两个用户对象之间的相等性。在Visual Studio的帮助文件中或者此处有一些使用此接口的不错的示例。我们可能能够从示例中收集一些指令,以干净的方式比较属性并以某种有用的方式存储值以进行跟踪(也许是集合或者字典对象?)。
希望这可以帮助,
格雷格
回答
我们将需要一个单独的对象,例如StepDiff,其中包含用于删除和添加的项目的集合。进行此类操作的最简单方法是从每个旧对象和新对象复制集合,以便StepDiff具有collectionOldStepDocs和collectionNewStepDocs。
拿起较短的集合并进行遍历,看看每个StepDoc是否在另一个集合中。如果是这样,请从两个集合中删除StepDoc参考。然后,当我们完成迭代时,collectionOldStepDocs包含已删除的stepDocs,collectionNewStepDocs包含已添加的stepDocs。
从那里,我们应该能够以任何必要的方式构建清单。