public DirectoryComparisonDifference Compare()
        {
            DirectoryComparisonDifference comparisonResult = new DirectoryComparisonDifference();

            if (!BaselineDifference.IsValidBaseline)
            {
                comparisonResult.InvalidBaselineData = true;
                return(comparisonResult);
            }

            if (!CheckDifference.IsValidBaseline)
            {
                comparisonResult.InvalidSecondaryData = true;
                return(comparisonResult);
            }

            IReadOnlyDictionary <string, FileDifference> checkFileLookup = CheckDifference.FileResults.ToDictionary(x => x.File, x => x);

            foreach (FileDifference baselineFileDiff in BaselineDifference.FileResults)
            {
                if (!checkFileLookup.TryGetValue(baselineFileDiff.File, out FileDifference checkFileDiff))
                {
                    FileComparisonDifference fileResult = new FileComparisonDifference(baselineFileDiff.File);
                    fileResult.MissingSecondaryFile = true;
                    comparisonResult.AddFileResult(fileResult);
                }
                else
                {
                    FileDifferenceComparer   comparer   = new FileDifferenceComparer(baselineFileDiff, checkFileDiff);
                    FileComparisonDifference fileResult = comparer.Compare();
                    comparisonResult.AddFileResult(fileResult);
                }
            }

            // check for files in the check result but not the baseline.
            HashSet <string> baselineFileLookup = new HashSet <string>(BaselineDifference.FileResults.Select(x => x.File));

            foreach (FileDifference checkFileDifference in CheckDifference.FileResults)
            {
                if (!baselineFileLookup.Contains(checkFileDifference.File))
                {
                    FileComparisonDifference fileResult = new FileComparisonDifference(checkFileDifference.File);
                    fileResult.MissingBaselineFile = true;
                    comparisonResult.AddFileResult(fileResult);
                }
            }

            return(comparisonResult);
        }
        public static StructuredDirectoryComparisonDifference FromDirectoryComparisonDifference(DirectoryComparisonDifference difference)
        {
            StructuredDirectoryComparisonDifference structuredDifference = new StructuredDirectoryComparisonDifference()
            {
                InvalidBaselineData  = difference.InvalidBaselineData,
                InvalidSecondaryData = difference.InvalidSecondaryData,
                FileResults          = difference.FileResults.Select(x => StructuredFileComparisonDifference.FromFileComparisonDifference(x)).ToList()
            };

            return(structuredDifference);
        }