Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- namespace EqualityComparerPOC
- {
- public static class ComparerUtil
- {
- public static DifferencesResult<T> GetDifferences<T, TKey>(
- IEnumerable<T> originalList,
- IEnumerable<T> changedList,
- Func<T, TKey> keyExtractor)
- {
- DifferencesResult<T> results = new DifferencesResult<T>();
- var keyComparer = new KeyEqualityComparer<T, TKey>(keyExtractor);
- results.Added = changedList.Except(originalList, keyComparer);
- results.Removed = originalList.Except(changedList, keyComparer);
- return results;
- }
- public static DifferencesResult<T> GetDifferences<T, TKey, TDiff>(
- IEnumerable<T> originalList,
- IEnumerable<T> changedList,
- Func<T, TKey> keyExtractor,
- Func<T, TDiff> differenceExtractor)
- {
- DifferencesResult<T> results = new DifferencesResult<T>();
- var keyComparer = new KeyEqualityComparer<T, TKey>(keyExtractor);
- var diffComparer = new KeyEqualityComparer<T, TDiff>(differenceExtractor);
- results.Added = changedList.Except(originalList, keyComparer);
- results.Removed = originalList.Except(changedList, keyComparer);
- results.Changed = changedList.Except(originalList, diffComparer)
- .Except(results.Added, keyComparer)
- .Except(results.Added, keyComparer);
- return results;
- }
- public class DifferencesResult<T>
- {
- public IEnumerable<T> Added { get; set; }
- public IEnumerable<T> Removed { get; set; }
- public IEnumerable<T> Changed { get; set; }
- }
- /// <summary>
- /// Generice impl of <see cref="IEqualityComparer"/>
- /// </summary>
- /// <example>
- /// var treeComparer = new KeyEqualityComparer<TreeDefinition, int?>((t) => t.TreeID);
- /// </example>
- /// <typeparam name="T">The type of object comparing</typeparam>
- /// <typeparam name="TKey">The type of key comparing</typeparam>
- class KeyEqualityComparer<T, TKey> : IEqualityComparer<T>
- {
- protected readonly Func<T, TKey> keyExtractor;
- public KeyEqualityComparer(Func<T, TKey> keyExtractor)
- {
- this.keyExtractor = keyExtractor;
- }
- public virtual bool Equals(T x, T y)
- {
- return this.keyExtractor(x).Equals(this.keyExtractor(y));
- }
- public int GetHashCode(T obj)
- {
- return this.keyExtractor(obj).GetHashCode();
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment