using System.Collections.Generic;
public string Instruction
public IList<FormulaItem> Items
public class CustomFormulaItemsComparer : AbstractComparer<IList<FormulaItem>>
public CustomFormulaItemsComparer(ComparisonSettings settings, BaseComparer parentComparer, IComparersFactory factory): base (settings, parentComparer, factory)
public override IEnumerable<Difference> CalculateDifferences(IList<FormulaItem> obj1, IList<FormulaItem> obj2)
if (obj1 == null && obj2 == null)
if (obj1 == null || obj2 == null)
yield return new Difference("", DefaultValueComparer.ToString(obj1), DefaultValueComparer.ToString(obj2));
if (obj1.Count != obj2.Count)
yield return new Difference("Count", obj1.Count.ToString(), obj2.Count.ToString(), DifferenceTypes.NumberOfElementsMismatch);
foreach (var formulaItem in obj1)
var formulaItem2 = obj2.FirstOrDefault(fi => fi.Id == formulaItem.Id);
if (formulaItem2 != null)
var comparer = Factory.GetObjectsComparer<FormulaItem>();
foreach (var difference in comparer.CalculateDifferences(formulaItem, formulaItem2))
yield return difference.InsertPath("[Id=" + formulaItem.Id + "]");
public class MyComparersFactory : ComparersFactory
public override ObjectsComparer.IComparer<T> GetObjectsComparer<T>(ComparisonSettings settings = null, BaseComparer parentComparer = null)
if (typeof (T) != typeof (IList<FormulaItem>))
return base.GetObjectsComparer<T>(settings, parentComparer);
var comparer = new CustomFormulaItemsComparer(settings, parentComparer, this);
return (ObjectsComparer.IComparer<T>)comparer;
public static void Main()
MyComparersFactory _factory = new MyComparersFactory();
ObjectsComparer.IComparer<Formula> _comparer = _factory.GetObjectsComparer<Formula>();
var formula1 = new Formula{Id = 1, Name = "Formula 1", Items = new List<FormulaItem>{new FormulaItem{Id = 1, Delay = 60, Name = "Item 1", Instruction = "Instruction 1"}}};
var formula2 = new Formula{Id = 1, Name = "Formula 1", Items = new List<FormulaItem>{new FormulaItem{Id = 1, Delay = 80, Name = "Item One", Instruction = "Instruction One"}}};
IEnumerable<Difference> differences;
var isEqual = _comparer.Compare(formula1, formula2, out differences);
Console.WriteLine(isEqual);
foreach (Difference dif in differences)
diferenca += $"{dif.MemberPath}: {dif.Value1} -> {dif.Value2}" + System.Environment.NewLine;
Console.WriteLine(diferenca);