public static StringDiffResult Compare(string expected, string actual) { if (expected == null) { throw new ArgumentNullException(nameof(expected)); } if (actual == null) { throw new ArgumentNullException(nameof(actual)); } var length = Math.Min(expected.Length, actual.Length); var comparison = Enumerable .Range(0, length) .Zip(expected, (i, c) => new { I = i, Expected = c }) .Zip(actual, (z, c) => new { z.I, AreEqual = c.Equals(z.Expected) }) .ToArray(); var areEqual = expected.Length == actual.Length && comparison.All(x => x.AreEqual); if (areEqual) { return(new StringDiffResult(true)); } var firstDifference = comparison.FirstOrDefault(x => !x.AreEqual); var firstDifferenceIndex = firstDifference == null ? length : firstDifference.I; return(StringDiff.CreateResult(expected, actual, firstDifferenceIndex)); }
private static StringDiffResult CreateResult(string expected, string actual, int firstDifferenceIndex) { var details = $"Expected:\n{StringDiff.CreateAroundIndex(expected, firstDifferenceIndex)}\nActual:\n{StringDiff.CreateAroundIndex(actual, firstDifferenceIndex)}"; return(new StringDiffResult(false, firstDifferenceIndex, details)); }