zoukankan      html  css  js  c++  java
  • 让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哦。

  • 相关阅读:
    1、TensorFlow简介
    4、numpy+pandas速查手册
    3、pandas
    2、Numpy常用函数
    11、C内存四区模型
    1、Numpy基础
    10、C++函数
    开始
    创建与删除SQL约束或字段约束
    Halcon
  • 原文地址:https://www.cnblogs.com/czcz1024/p/2792554.html
Copyright © 2011-2022 走看看