让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哦。
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号