DiffComparator.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace Quadarax.Foundation.Core.Data.Diff
  5. {
  6. public class DiffComparator<TEntry> where TEntry : DiffEntry, new()
  7. {
  8. private readonly IEnumerable<TEntry> _left;
  9. private readonly IEnumerable<TEntry> _right;
  10. public DiffComparator(IEnumerable<TEntry> leftCollection, IEnumerable<TEntry> rightCollection)
  11. {
  12. _left = leftCollection;
  13. _right = rightCollection;
  14. }
  15. public DiffComparator(IEnumerable<object> leftData, IEnumerable<object> rightData)
  16. {
  17. var left = new List<TEntry>();
  18. foreach (var data in leftData)
  19. {
  20. var entry = new TEntry();
  21. entry.SetItem(data);
  22. left.Add(entry);
  23. }
  24. _left = left;
  25. var right = new List<TEntry>();
  26. foreach (var data in rightData)
  27. {
  28. var entry = new TEntry();
  29. entry.SetItem(data);
  30. right.Add(entry);
  31. }
  32. _right = right;
  33. }
  34. public IEnumerable<TEntry> CompareLeftSide()
  35. {
  36. return _left.Select(letItem => Compare(letItem, _right)).ToList();
  37. }
  38. public IEnumerable<TEntry> CompareRightSide()
  39. {
  40. return _right.Select(rightItem => Compare(rightItem, _left)).ToList();
  41. }
  42. private TEntry Compare(TEntry source, IEnumerable<TEntry> target)
  43. {
  44. if (source == null)
  45. throw new ArgumentNullException(nameof(source));
  46. if (target == null)
  47. throw new ArgumentNullException(nameof(target));
  48. var key = source.GetKey();
  49. source.SetCompareState(source.Compare(Find(key, target)));
  50. return source;
  51. }
  52. private TEntry? Find(object key, IEnumerable<TEntry> target)
  53. {
  54. if (target == null)
  55. throw new ArgumentNullException(nameof(target));
  56. return target.FirstOrDefault(x => Equals(x.GetKey(), key));
  57. }
  58. }
  59. }