让linq 的distinct更方便一点吧

linq 的 Distinct在集合操作中经常被用到。对于值类型的,很方便,直接Distinct()即可,但是对引用类型,需要实现一个
IEqualityComparer<in T> 的接口。
对每种引用类型,分别实现接口实在是太麻烦了。

一般来说,做这种distinct的时候,都是根据object的一个属性来判断是否是一个值。
比如:
public class User
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
一般来说,都是通过id这个属性来判断的,id一样既认为是同一个。
当然可以通过override User的equals和gethashcode来实现,但是不灵活。
如果我这次通过id来distinct下次通过name来distinct怎么办呢?
我希望有这样一种写法
var list = new List<User>();
list.Distinct(x => x.ID)

只要指定通过那个属性来判断,即可做出distinct

 

自己来写个扩展方法吧

   1: public static IEnumerable<TSource> Distinct<TSource, TCompareElement>(this IEnumerable<TSource> source, Func<TSource, TCompareElement> CompareSelector)
   2: {
   3:     return source.Distinct(new SinglePropertyEqualityComparer<TSource, TCompareElement>(CompareSelector));
   4: }
   5:  
   6: public class SinglePropertyEqualityComparer<T, Telement> : IEqualityComparer<T>
   7: {
   8:     private readonly Func<T, Telement> CompareSelector;
   9:  
  10:     public SinglePropertyEqualityComparer(Func<T, Telement> compareSelector)
  11:     {
  12:         CompareSelector = compareSelector;
  13:     }
  14:  
  15:     public bool Equals(T x, T y)
  16:     {
  17:         return CompareSelector(x).Equals(CompareSelector(y));
  18:     }
  19:  
  20:     public int GetHashCode(T obj)
  21:     {
  22:         return CompareSelector(obj).GetHashCode();
  23:     }
  24: }

 

 

只是linq 2 object哦。

posted @ 2012-11-28 14:26  czcz1024  阅读(196)  评论(0编辑  收藏  举报