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); }
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); }