CommonEqualityComparer.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /* 作者: 季健国
  2. * 创建时间: 2012/8/1 21:47:05
  3. *
  4. */
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. namespace Ant.Service.Common
  10. {
  11. public class CommonEqualityComparer<T, V> : IEqualityComparer<T>
  12. {
  13. private Func<T, V> keySelector;
  14. private IEqualityComparer<V> comparer;
  15. public CommonEqualityComparer(Func<T, V> keySelector, IEqualityComparer<V> comparer)
  16. {
  17. this.comparer = comparer;
  18. }
  19. public CommonEqualityComparer(Func<T, V> keySelector)
  20. : this(keySelector, EqualityComparer<V>.Default)
  21. { }
  22. public bool Equals(T x, T y)
  23. {
  24. return comparer.Equals(keySelector(x), keySelector(y));
  25. }
  26. public int GetHashCode(T obj)
  27. {
  28. return comparer.GetHashCode(keySelector(obj));
  29. }
  30. }
  31. /// <summary>
  32. /// 比较器
  33. /// </summary>
  34. public static class DistinctExtensions
  35. {
  36. public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector)
  37. {
  38. return source.Distinct(new CommonEqualityComparer<T, V>(keySelector));
  39. }
  40. public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector, IEqualityComparer<V> comparer)
  41. {
  42. return source.Distinct(new CommonEqualityComparer<T, V>(keySelector, comparer));
  43. }
  44. }
  45. }