Пример #1
0
        public static DiffList Compress(DiffList diffList)
        {
            DiffList result = new DiffList();

            foreach (DiffItem diffItem in diffList)
            {
                if (diffItem.Status != DiffStatus.Unchanged)
                {
                    result.Add(diffItem);
                }
            }

            return(result);
        }
Пример #2
0
        public static DiffList Diff(System.Collections.IList source, System.Collections.IList target)
        {
            DiffList results = new DiffList();

            int i = 0;
            int j = 0;
            int k = 0;

            while (!(i == source.Count && j == target.Count))
            {
                //End of target.
                if (j == target.Count)
                {
                    results.Add(new DiffItem(DiffStatus.Deleted, i, source[i]));
                    i++;
                    continue;
                }

                //End of source.
                if (i == source.Count)
                {
                    results.Add(new DiffItem(DiffStatus.Inserted, j, target[j]));
                    j++;
                    continue;
                }

                //End of source.
                if ((i + k) == source.Count)
                {
                    results.Add(new DiffItem(DiffStatus.Deleted, i, source[i]));
                    results.Add(new DiffItem(DiffStatus.Inserted, j, target[j]));
                    i++;
                    j++;
                    k = 0;
                    continue;
                }

                //End of target.
                if ((j + k) == target.Count)
                {
                    results.Add(new DiffItem(DiffStatus.Deleted, i, source[i]));
                    results.Add(new DiffItem(DiffStatus.Inserted, j, target[j]));
                    i++;
                    j++;
                    k = 0;
                    continue;
                }

                bool match_i = false;
                bool match_j = false;

                if (source[i + k].Equals(target[j]))
                {
                    match_i = true;
                }
                if (source[i].Equals(target[j + k]))
                {
                    match_j = true;
                }

                if (match_i && match_j)
                {
                    results.Add(new DiffItem(DiffStatus.Unchanged, i, source[i]));
                    i++;
                    j++;
                    k = 0;
                }
                else if (match_i)
                {
                    results.Add(new DiffItem(DiffStatus.Deleted, i, source[i]));
                    i++;
                    k = 0;
                }
                else if (match_j)
                {
                    results.Add(new DiffItem(DiffStatus.Inserted, j, target[j]));
                    j++;
                    k = 0;
                }
                else
                {
                    k++;
                }
            }

            return(results);
        }