public static IEnumerable <IReadOnlyCollection <DiffRecord> > Diff(IList <JToken> from, IList <JToken> to) { var length = from.Count > to.Count ? from.Count : to.Count; for (var i = 0; i < length; i++) { var fromToken = i < from.Count ? from[i] : _emptyToken; var toToken = i < to.Count ? to[i] : _emptyToken; var patch = new JsonDiffer(); var forwardPatch = patch.Diff(fromToken, toToken, true); var backwardPatch = patch.Diff(toToken, fromToken, true); if (TryParseJson(forwardPatch.ToString(), out var forwardTokens) && TryParseJson(backwardPatch.ToString(), out var backwardTokens)) { var operations = new DiffRecord[forwardTokens.Count]; for (var j = 0; j < operations.Length; j++) { var forwardToken = forwardTokens[j]; var forwardOperation = JsonConvert.DeserializeObject <PatchOperation>(forwardToken.ToString()); var backwardToken = backwardTokens[j]; var backwardOperation = JsonConvert.DeserializeObject <PatchOperation>(backwardToken.ToString()); operations[j] = new DiffRecord { Op = forwardOperation.Op, Path = forwardOperation.Path, SideValue = forwardOperation.Value, BaseValue = backwardOperation.Value }; } yield return(operations); } else { throw new InvalidOperationException(); } } }
private PatchDocument DiffInternal(JToken from, JToken to, bool useIdPropertyToDetermineEquality) { return(_differ.Diff(from, to, useIdPropertyToDetermineEquality)); }