I have to compare two lists of type Slide which contain another List of Items, called Charts. I have to find all differences between the Slide-lists, whereby a difference could be:
a Slide in List A , but not in B
a Slide in List A , but not in B
a Slide which is in both Lists, but their Charts are different
I tried to use except, but it returns Lists with different Charts as "the same". Example List A: A B C D List B: A B C D* (d contains different charts) Should return D*, but this does not work.
I am little bit confused as to why this happens - to comparer looks ok for me.
My code:
class PPDetectDifferences { private PPPresentation laterVersion; private string Path { get; set; } private PPPresentation OriginalPresentation { get; set; } private PPPresentation GetLaterPresentation() { var ppDal = new PPDAL(Path); Task<PPPresentation> task = Task.Run(() => ppDal.GetPresentation()); var presentation = task.Result; return presentation; } public PPDetectDifferences(string path, PPPresentation ppPresentation) { if (path != null) { this.Path = path; } else { throw new ArgumentNullException("path"); } if (ppPresentation != null) { this.OriginalPresentation = ppPresentation; } else { throw new ArgumentNullException("ppPresentation"); } } public bool IsDifferent() { //// getting the new List of Slides laterVersion = GetLaterPresentation(); //// Compare the newer version with the older version var result = laterVersion.Slides.Except(OriginalPresentation.Slides, new PPSlideComparer()).ToList(); //// If there are no differences, result.count should be 0, otherwise some other value. return result.Count != 0; } } /// <summary> /// Compares two Slides with each other /// </summary> public class PPSlideComparer : IEqualityComparer<PPSlide> { public int GetHashCode(PPSlide slide) { if (slide == null) { return 0; } //// ID is an INT, which is unique to this Slide return slide.ID.GetHashCode(); } public bool Equals(PPSlide s1, PPSlide s2) { var s1Charts = (from x in s1.Charts select x).ToList(); var s2Charts = (from x in s2.Charts select x).ToList(); var result = s1Charts.Except(s2Charts, new PPChartComparer()).ToList(); return result.Count == 0; } } /// <summary> /// Compares two Charts with each other /// </summary> public class PPChartComparer : IEqualityComparer<PPChart> { public int GetHashCode(PPChart chart) { //// UID is an INT, which is unique to this chart return chart == null ? 0 : chart.UID.GetHashCode(); } public bool Equals(PPChart c1, PPChart c2) { var rvalue = c1.UID == c2.UID; if (c1.ChartType != c2.ChartType) { rvalue = false; } return rvalue; } }