获取两个相同对象之间的差异列表的最佳方法

时间:2020-03-05 18:51:30  来源:igfitidea点击:

我想生成同一对象的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。

从那里,我们应该能够以任何必要的方式构建清单。