コード例 #1
0
 private DiffType GetDiffType(ListCompare compare)
 {
     if (compare.Base < 0)
     {
         return(DiffType.Add);
     }
     if (compare.Compare < 0)
     {
         return(DiffType.Delete);
     }
     if (compare.IsDifferent)
     {
         return(DiffType.Change);
     }
     return(DiffType.Normal);
 }
コード例 #2
0
 public bool Equals(ListCompare c)
 {
     return(c._base == this._base && c._compare == this._compare && c._isDifferent == this._isDifferent);
 }
コード例 #3
0
        private static void TwoWayDiff(XElement baseElem, XElement compareElem, ElementWriter bWriter, ElementWriter cWriter, List <ListCompare> results)
        {
            var baseList    = GetKeys(baseElem.Elements());
            var compareList = GetKeys(compareElem.Elements());

            var compares = ListCompare.Create(baseList, compareList, v => v.Item1);

            // Deal with the relationships of versionable items
            if (baseElem.Name.LocalName == "Relationships" && !compares.Any(c => c.Base >= 0 && c.Compare >= 0))
            {
                var baseRelateds    = baseElem.Elements().Select(e => Tuple.Create(GetRelatedId(e), e)).ToList();
                var compareRelateds = compareElem.Elements().Select(e => Tuple.Create(GetRelatedId(e), e)).ToList();
                if (!baseRelateds.Any(t => string.IsNullOrEmpty(t.Item1)) &&
                    !compareRelateds.Any(t => string.IsNullOrEmpty(t.Item1)) &&
                    baseRelateds.Select(t => t.Item1).Distinct().Count() == baseRelateds.Count &&
                    compareRelateds.Select(t => t.Item1).Distinct().Count() == compareRelateds.Count)
                {
                    compares = ListCompare.Create(baseRelateds, compareRelateds, v => v.Item1);
                }
            }

            int start;

            foreach (var tuple in compares)
            {
                if (tuple.Base < 0)
                {
                    start = cWriter.CurrentLine + 1;
                    cWriter.WriteElement(compareList[tuple.Compare].Item2);
                    results.AddRange(Enumerable.Range(start, cWriter.CurrentLine - start + 1).Select(i => new ListCompare(-1, i)));
                }
                else if (tuple.Compare < 0)
                {
                    start = bWriter.CurrentLine + 1;
                    bWriter.WriteElement(baseList[tuple.Base].Item2);
                    results.AddRange(Enumerable.Range(start, bWriter.CurrentLine - start + 1).Select(i => new ListCompare(i, -1)));
                }
                else if (baseList[tuple.Base].Item2.Elements().Any() &&
                         compareList[tuple.Compare].Item2.Elements().Any())
                {
                    results.Add(new ListCompare(bWriter.CurrentLine + 1, cWriter.CurrentLine + 1)
                    {
                        IsDifferent = false
                    });
                    bWriter.WriteStartElement(baseList[tuple.Base].Item2);
                    cWriter.WriteStartElement(compareList[tuple.Compare].Item2);
                    TwoWayDiff(baseList[tuple.Base].Item2, compareList[tuple.Compare].Item2, bWriter, cWriter, results);
                    bWriter.WriteEndElement();
                    cWriter.WriteEndElement();
                }
                else if (baseList[tuple.Base].Item2.Elements().Any() || compareList[tuple.Compare].Item2.Elements().Any() || baseList[tuple.Base].Item2.Value != compareList[tuple.Compare].Item2.Value)
                {
                    results.Add(new ListCompare(bWriter.CurrentLine + 1, cWriter.CurrentLine + 1)
                    {
                        IsDifferent = true
                    });
                    for (int i = results.Last().Base; i < bWriter.CurrentLine; i++)
                    {
                        results.Add(new ListCompare(i, -1));
                    }
                    for (int i = results.Last().Compare; i < cWriter.CurrentLine; i++)
                    {
                        results.Add(new ListCompare(-1, i));
                    }
                    bWriter.WriteElement(baseList[tuple.Base].Item2);
                    cWriter.WriteElement(compareList[tuple.Compare].Item2);
                }
                else
                {
                    results.Add(new ListCompare(bWriter.CurrentLine + 1, cWriter.CurrentLine + 1));
                    bWriter.WriteElement(baseList[tuple.Base].Item2);
                    cWriter.WriteElement(compareList[tuple.Compare].Item2);
                }
            }
        }