andrew4582

ComparerUtil

Jan 24th, 2013
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.32 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace EqualityComparerPOC
  6. {
  7.     public static class ComparerUtil
  8.     {
  9.         public static DifferencesResult<T> GetDifferences<T, TKey>(
  10.             IEnumerable<T> originalList,
  11.             IEnumerable<T> changedList,
  12.             Func<T, TKey> keyExtractor)
  13.         {
  14.  
  15.             DifferencesResult<T> results = new DifferencesResult<T>();
  16.  
  17.             var keyComparer = new KeyEqualityComparer<T, TKey>(keyExtractor);
  18.  
  19.             results.Added = changedList.Except(originalList, keyComparer);
  20.             results.Removed = originalList.Except(changedList, keyComparer);
  21.  
  22.             return results;
  23.         }
  24.  
  25.         public static DifferencesResult<T> GetDifferences<T, TKey, TDiff>(
  26.             IEnumerable<T> originalList,
  27.             IEnumerable<T> changedList,
  28.             Func<T, TKey> keyExtractor,
  29.             Func<T, TDiff> differenceExtractor)
  30.         {
  31.  
  32.             DifferencesResult<T> results = new DifferencesResult<T>();
  33.  
  34.             var keyComparer = new KeyEqualityComparer<T, TKey>(keyExtractor);
  35.             var diffComparer = new KeyEqualityComparer<T, TDiff>(differenceExtractor);
  36.  
  37.             results.Added = changedList.Except(originalList, keyComparer);
  38.             results.Removed = originalList.Except(changedList, keyComparer);
  39.  
  40.             results.Changed = changedList.Except(originalList, diffComparer)
  41.                                         .Except(results.Added, keyComparer)
  42.                                         .Except(results.Added, keyComparer);
  43.  
  44.             return results;
  45.         }
  46.  
  47.         public class DifferencesResult<T>
  48.         {
  49.             public IEnumerable<T> Added { get; set; }
  50.             public IEnumerable<T> Removed { get; set; }
  51.             public IEnumerable<T> Changed { get; set; }
  52.         }
  53.  
  54.         /// <summary>
  55.         /// Generice impl of <see cref="IEqualityComparer"/>
  56.         /// </summary>
  57.         /// <example>
  58.         /// var treeComparer = new KeyEqualityComparer<TreeDefinition, int?>((t) => t.TreeID);
  59.         /// </example>
  60.         /// <typeparam name="T">The type of object comparing</typeparam>
  61.         /// <typeparam name="TKey">The type of key comparing</typeparam>
  62.         class KeyEqualityComparer<T, TKey> : IEqualityComparer<T>
  63.         {
  64.             protected readonly Func<T, TKey> keyExtractor;
  65.  
  66.             public KeyEqualityComparer(Func<T, TKey> keyExtractor)
  67.             {
  68.                 this.keyExtractor = keyExtractor;
  69.             }
  70.  
  71.             public virtual bool Equals(T x, T y)
  72.             {
  73.                 return this.keyExtractor(x).Equals(this.keyExtractor(y));
  74.             }
  75.  
  76.             public int GetHashCode(T obj)
  77.             {
  78.                 return this.keyExtractor(obj).GetHashCode();
  79.             }
  80.         }
  81.     }
  82. }
Advertisement
Add Comment
Please, Sign In to add comment