public void TestMethod1() { var left = new List <string> { "A", "C", "G", "F", "B" }; var right = new List <string> { "A", "B", "C", "D", "G", "H" }; var changes = UnorderedListComparer.Compare(left, right, string.Equals).ToList(); Assert.AreEqual(7, changes.Count); Check(changes, 0, ChangeType.Unmodified, "A", "A"); Check(changes, 1, ChangeType.Unmodified, "C", "C"); Check(changes, 2, ChangeType.Unmodified, "B", "B"); Check(changes, 3, ChangeType.Unmodified, "G", "G"); Check(changes, 4, ChangeType.Added, null, "D"); Check(changes, 5, ChangeType.Removed, "F", null); Check(changes, 6, ChangeType.Added, null, "H"); }
internal static IEnumerable <DiffTreeNode> BuildCSharpTree(List <CodeNode> leftList, List <CodeNode> rightList) { // probably can be done cleaner // left and right list are CodeNodes that must be compared. // if a node is an IdentifiableCodeNode, it has a unique identifier: // -> use that to find it in the other list, even though its code content may be different // if its not an IdentifiableCodeNode, comparison is done by code content and will only match if the code is identical leftList = leftList ?? new List <CodeNode>(); // deliberate null pattern, we want to support non existing trees (=empty) too. rightList = rightList ?? new List <CodeNode>(); var list = new List <DiffTreeNode>(); var changes = UnorderedListComparer.Compare(leftList, rightList, (leftNode, rightNode) => { if (leftNode is IdentifiableCodeNode leftDcn && rightNode is IdentifiableCodeNode rightDcn) { return(leftDcn.Equals(rightDcn)); } return(string.Equals(RemoveWhiteSpace(leftNode?.Source), RemoveWhiteSpace(rightNode?.Source))); }).ToList();