1. 程式人生 > 實用技巧 >資料去重Distinct,IEqualityComparer,IEquatable

資料去重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);