public Difference PerformDiff(object newObj, object oldObj, string propName, Type type, Func<object, object, string, Type, Difference> diffChildCallback) { var newArray = newObj == null ? new List<object>() : (newObj as IEnumerable).Cast<object>().ToList(); var oldArray = oldObj == null ? new List<object>() : (oldObj as IEnumerable).Cast<object>().ToList(); var sameObjectComparer = new HashCodeEqualityComparer(); var parentDifference = new Difference(propName, newObj, oldObj) { ChildDiffs = newArray.Union(oldArray).Distinct(sameObjectComparer) .Select(elem => new { newItem = newArray.FirstOrDefault(x => sameObjectComparer.Equals(x, elem)), oldItem = oldArray.FirstOrDefault(x => sameObjectComparer.Equals(x, elem)) }) .Select( change => diffChildCallback(change.newItem, change.oldItem, "Item", GetEnumerableElementType(type))) .Where(d => d != null) .ToList() }; // assume arrays are the same if there are no child differences return parentDifference.ChildDiffs.Any() ? parentDifference : null; }
public Difference PerformDiff(object newObj, object oldObj, string propName, Type type, Func <object, object, string, Type, Difference> diffChildCallback) { var newArray = newObj == null ? new List <object>() : (newObj as IEnumerable).Cast <object>().ToList(); var oldArray = oldObj == null ? new List <object>() : (oldObj as IEnumerable).Cast <object>().ToList(); var sameObjectComparer = new HashCodeEqualityComparer(); var parentDifference = new Difference(propName, newObj, oldObj) { ChildDiffs = newArray.Union(oldArray).Distinct(sameObjectComparer) .Select(elem => new { newItem = newArray.FirstOrDefault(x => sameObjectComparer.Equals(x, elem)), oldItem = oldArray.FirstOrDefault(x => sameObjectComparer.Equals(x, elem)) }) .Select( change => diffChildCallback(change.newItem, change.oldItem, "Item", GetEnumerableElementType(type))) .Where(d => d != null) .ToList() }; // assume arrays are the same if there are no child differences return(parentDifference.ChildDiffs.Any() ? parentDifference : null); }