zoukankan      html  css  js  c++  java
  • C# distnict去重

      在C#中,使用distinct的时候,会发现有些情况不好使,比如我是泛型集合的时候,发现没去掉重复。这是因为对于引用类型,distinct里的默认比较器比较的是其引用地址,程序中集合里的每一个元素都是个新的实例,引用地址都是不同的,所以不会被作为重复记录删除掉。因此我们需要自定义比较器进行去重,实现指定条件去重复。

      本章主要讲解如何设计比较器。我们先来看看第一版:

    public class JuryComparer: IEqualityComparer<T_S_SalesPointModel>
        {
            public bool Equals(T_S_SalesPointModel x, T_S_SalesPointModel y)
            { 
                return x.ClientCode.Equals(y.ClientCode);
            }
    
            public int GetHashCode(T_S_SalesPointModel obj)
            {
                return 0;
            }
        }

      使用的时候很简单,.Distinct(new JuryComparer()),在distinct里实例化这个参数传入即可。

      但是很快我们就发现一个问题,我们别的业务里也需要用到这个,如果作为一个公共方法,显然我是不能把model指定死的,所以有了第二版:

        public class JuryComparer<T> : IEqualityComparer<T>
        {
            public bool Equals(T x, T y)
            {
                dynamic dx = x;
                dynamic dy = y; 
                return dx.ClientCode.Equals(dy.ClientCode);
            }
    
            public int GetHashCode(T obj)
            {
                return 0;
            }
        }

      通过泛型T我们可以在方法内部不指定具体类型,这样就方法就能自适应不同的model了。

      然鹅,今天遇到一种情况,即,我们自定义的方法中,是通过ClientCode去做比较的,如果外部model中不存在这个Code,那我们就无法比较,因为方法会报错,提示没有这个属性。也就是说我们的通用方法除了model需要通用以外,这个属性,应该从外部传进来,那么如何实现呢,请看第三版:

    public class JuryComparer<T> : IEqualityComparer<T>
        {
            private string _attribute;
            public JuryComparer(string attribute)
            {
                _attribute = attribute;
            }
            public bool Equals(T x, T y)
            {
                dynamic dx = x;
                dynamic dy = y;
                var vx = dx.GetType().GetProperty(_attribute).GetValue(dx, null);
                var vy = dy.GetType().GetProperty(_attribute).GetValue(dy, null);
                return vx.Equals(vy);
            }
    
            public int GetHashCode(T obj)
            {
                return 0;
            }
        }

      通过构造函数传参,我们将外部参数赋值给内部私有变量,最后在比较方法里, 我们通过反射获取属性实现自适应。这样外部就能通过这种方式实现调用:

      .Distinct(new JuryComparer<TreeModel>("value"))

      既可以传入不同的model,又可以传入不同的属性。

      以上。

  • 相关阅读:
    [模板] 主席树
    [模板] 替罪羊树
    [模板] Treap
    [LUOGU] P4342 [IOI1998]Polygon
    [JOYOI] 1051 选课
    poj 1845 数论(唯一分解定理+分治法求等比数列前n项的和mod m的值)
    poj 2418 bst统计字符串
    hdu 3791 二叉排序树
    hdu 3999 二叉排序树
    toj 3711 水题
  • 原文地址:https://www.cnblogs.com/sunshine-wy/p/13522765.html
Copyright © 2011-2022 走看看