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