数据去重Distinct,IEqualityComparer,IEquatable

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

Distinct

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

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

IEqualityComparer

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//
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();
    }
}

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

1
2
3
4
5
6
7
8
9
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大多用作去重性质上。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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;
       }
   } 

使用:

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

  

 

posted @   YanBigFeg  阅读(292)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示