数据去重Distinct,IEqualityComparer,IEquatable

很多情况下我们查询数据需要去重重复数据,下面就记录三个去重的方法。

Distinct

最基本的去重形式,直接查询出数据后使用Distinct方法进行字段去重。

       var strList = new List<string>() { "1","2","1"};
       var resultList = strList.Distinct();//结果1,2

IEqualityComparer

此方法扩展接口可以实现类级别的去重,比如我想实现其中一个表中的某些数据根据其中一个字段去重,这个时候我们就可以使用IEqualityComparer接口,首先需要对做去重的类实现接口IEqualityComparer

    //
    public class Model_DistIn: IEqualityComparer<T_mode>
    {
        public bool Equals(T_modex, T_modey)
        {
            if (x == null || y == null)
                return false;
            if (x.orderId == y.orderId)
                return true;
            else
                return false;
        }

        public int GetHashCode(T_modeobj)
        {
            if (obj == null)
                return 0;
            else
                return obj.orderId.GetHashCode();
        }
    }

 然后我们就可以在查询数据的地方使用此类进行对比:伪代码

 var resultList = db.Entities
                    .OrderByDescending(b => b.addTime)
                    .ToList()
                    .Distinct(new Model_DistIn())
                    .Select(b => new ComoboData
                            {
                                 text = b.orderNum,
                                 value = b.orderId,
                             }).ToList();

 IEquatable 

此接口方法跟IEqualityComparer写法很类似,都是用作比较确定某个对象与当前实例在结构上是否相等。但是这个一般使用在自定义对象比较字段。

而IEqualityComparer大多用作去重性质上。

例如:

 public class Model_DistIn: IEquatable<Model_DistIn>
    {

        public string orderId { get; set; }
        public string orderName { get; set; }

        public bool Equals(Model_DistIn x, Model_DistIn y)
        {
            if (x == null || y == null)
                return false;
            if (x.orderId == y.orderId)
                return true;
            else
                return false;
        }

        public bool Equals(Model_DistIn obj)
        {
            if (obj == null)
                return false;
            else
                return true;
        }
    } 

使用:

   Model_DistIn m1 = new Model_DistIn();
   Model_DistIn m2 = new Model_DistIn();
   bool isSame = m1.Equals(m2);

  

 

posted @ 2020-09-01 17:26  YanBigFeg  阅读(268)  评论(0编辑  收藏  举报