コード例 #1
0
        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);
        }