Лучший способ получить список различий между 2 одинаковыми объектами - PullRequest
2 голосов
/ 11 сентября 2008

Я хотел бы создать список различий между 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 в БД с помощью сущности и репозитории. Мне нужно вызывать определенные события (например, добавление этого пользователя и т. Д.) Из этого метода SaveStep, однако, чтобы предупредить другую систему (механизм рабочего процесса), что конкретный элемент в шаге изменился. Спасибо.

Ответы [ 2 ]

2 голосов
/ 12 сентября 2008

Вам понадобится отдельный объект, такой как StepDiff с коллекциями для удаленных и добавленных элементов. Самый простой способ сделать что-то подобное - скопировать коллекции из каждого из старых и новых объектов, чтобы у StepDiff были collectionOldStepDocs и collectionNewStepDocs.

Захватите более короткую коллекцию, переберите ее и посмотрите, существует ли каждый StepDoc в другой коллекции. Если это так, удалите ссылку StepDoc из обеих коллекций. Затем, когда вы закончите итерацию, collectionOldStepDocs содержит stepDocs, которые были удалены, а collectionNewStepDocs содержит stepDocs, которые были добавлены.

Оттуда вы должны быть в состоянии построить свой манифест любым необходимым способом.

1 голос
/ 11 сентября 2008

Реализация интерфейса IComparable в вашем объекте может предоставить вам необходимую функциональность. Это предоставит вам индивидуальный способ определения различий между объектами, не прибегая к контрольным суммам, которые действительно не помогут вам отследить различия в терминах, которые можно использовать. Иначе нет способа определить равенство между двумя пользовательскими объектами в .NET, о которых я знаю. Есть несколько достойных примеров использования этого интерфейса в файле справки для Visual Studio или здесь . Возможно, вам удастся почерпнуть некоторые директивы из примеров о чистых способах сравнения свойств и сохранения значений некоторым удобным способом для целей отслеживания (возможно, коллекция или объект словаря?).

Надеюсь, это поможет, Грег

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...