private DataMatch MatchValues(DataVisitNode node1Parent, List <IDataVisitNode> nodes1, DataVisitNode node2Parent, List <IDataVisitNode> nodes2, bool expectSameCount) { if (nodes1 == null || nodes2 == null || (expectSameCount && nodes1.Count != nodes2.Count)) { return(ReferenceEquals(nodes1, nodes2) ? DataMatch.Empty : UnMatched(node1Parent, node2Parent)); } var match = new DataMatch(); if (expectSameCount) { for (int i = 0; i < nodes1.Count; i++) { match += Match((DataVisitNode)nodes1[i], (DataVisitNode)nodes2[i]); } } else { var alignedDiffs = Diff2.CompareAndAlign(nodes1, nodes2, modelNodeComparer, modelNodeSimilarityComparer, modelNodeCanAlign).ToList(); foreach (var alignedDiffChange in alignedDiffs) { switch (alignedDiffChange.Change) { case ChangeType.Same: case ChangeType.Changed: match += Match((DataVisitNode)nodes1[alignedDiffChange.Index1], (DataVisitNode)nodes2[alignedDiffChange.Index2]); break; case ChangeType.Added: match += new DataMatch(0, nodes2[alignedDiffChange.Index2].CountNodes()); break; case ChangeType.Deleted: match += new DataMatch(0, nodes1[alignedDiffChange.Index1].CountNodes()); break; } } } return(match); }