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

时间:2008-09-11 14:36:08

标签: c# oop

我想生成同一对象的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被删除,一条规则从“Go”变为“Stop”。我一直在研究使用MD5哈希,但我找不到任何好的例子来遍历这样的对象并返回清单中的特定差异(不只是表明它们是不同的)。

附加背景:我需要这样做的原因是我支持的API允许客户端使用SaveStep(步骤步骤)...这对于将Step对象持久保存到db非常有用使用实体和存储库。我需要从此SaveStep方法引发特定事件(例如此用户已添加等),以便警告另一个系统(工作流引擎)该步骤中的特定元素已更改。 谢谢。

2 个答案:

答案 0 :(得分:2)

您需要一个单独的对象,例如StepDiff,其中包含已删除和已添加项目的集合。执行此类操作的最简单方法是从每个旧对象和新对象复制集合,以便StepDiff具有collectionOldStepDocs和collectionNewStepDocs。

抓住较短的集合并迭代它,看看每个StepDoc是否存在于另一个集合中。如果是这样,请从两个集合中删除StepDoc引用。然后,当您完成迭代时,collectionOldStepDocs包含已删除的stepDocs,collectionNewStepDocs包含已添加的stepDocs。

从那里你应该能够以任何必要的方式建立你的清单。

答案 1 :(得分:1)

在对象中实现IComparable接口可能会为您提供所需的功能。这将为您提供一种自定义方法来确定对象之间的差异,而无需使用校验和,这实际上无法帮助您跟踪可用术语中的差异。否则,我无法确定.NET中两个用户对象之间的相等性。在Visual Studio的帮助文件或here中有一些关于此接口用法的例子。您可以从示例中收集一些关于干净方法的指令来比较属性并以某种可用的方式存储值以用于跟踪目的(可能是集合或字典对象?)。

希望这有帮助, 格雷格