程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> IEqualityComparer 接口的使用

IEqualityComparer 接口的使用

編輯:C#入門知識

       先給出MSDN關於IEqualityComparer 接口的介紹,點擊打開鏈接,IEqualityComparer主要適用於定義方法以支持對象的相等比較。可以實現集合的自定義相等比較。即,您可以創建自己的相等定義,並指定此定義與接受 IEqualityComparer 接口的集合類型一起使用。
              IEqualityComparer 接口包含兩個方法,方法
  名稱 說明
 Equals 確定指定的對象是否相等。
 GetHashCode 返回指定對象的哈希代碼。
整體來說,比較好理解
Equals方法:自反的、對稱的和可傳遞的。也就是說,如果此方法用於將某個對象與其自身比較,則它將返回 true;如果對 y 和 x 執行此方法返回 true,則對 x 和 y 這兩個對象也返回 true;如果對 x 和 y 執行此方法返回 true,並且對 y 和 z 執行此方法也返回 true,則對 x 和 z 這兩個對象也返回 true。
實現需要確保如果對兩個對象 x 和 y 執行 Equals 方法返回 true,則對 x 和 y 分別執行 GetHashCode 方法所返回的值必須相等。
<//www.w3.org/1999/xhtml:sentencetext xmlns="http://www.w3.org/1999/xhtml">
GetHashCode方法:實現需要確保如果對兩個對象 x 和 y 執行 Equals 方法返回 true,則對 x 和 y 分別執行 GetHashCode 方法所返回的值必須相等。
<//www.w3.org/1999/xhtml:sentencetext xmlns="http://www.w3.org/1999/xhtml">      當我們用Linq操作我們自定義的對象時,我們會發現有些方法直接使用的話根本不起作用,比如:Distinct、Except、Intersect等擴展方法。這是就需要定義IEqualityComparer接口來判斷兩個對象的相等性。
下面給出簡單實例說明:
首先,我們定義一個類,類如下
[csharp]
public class SellerTypeIdentify 
       { 
           /// <summary> 
           /// 商戶類型ID 
           /// </summary>      
           public string SellerTypeID 
           { 
               get; 
               set; 
           } 
           public string SellerName 
           { 
               get; 
               set; 
           } 
       } 

定義一個以SellerTypeID為基礎的比較器
[csharp] 
public class SellerTypeIdentifyComparer : IEqualityComparer<SellerTypeIdentify> 
      { 
          // SellerType are equal if their names and product numbers are equal. 
          public bool Equals(SellerTypeIdentify x, SellerTypeIdentify y) 
          { 
              //Check whether the compared objects reference the same data. 
              if (Object.ReferenceEquals(x, y)) return true; 
 
              if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) 
                  return false; 
 
              return x.SellerTypeID == y.SellerTypeID; 
          } 
          public int GetHashCode(SellerTypeIdentify product) 
          { 
              //Check whether the object is null  
              if (Object.ReferenceEquals(product, null)) return 0; 
 
              //Get hash code for the SellerTypeID field if it is not null.  
              int SellerTypeId = product.SellerTypeID == null ? 0 : product.SellerTypeID.GetHashCode(); 
 
              //Calculate the hash code for the SellerType.  
              return SellerTypeId; 
          } 
      } 
初始化數據
[csharp] 
public static List<SellerTypeIdentify> GetMainData() 
        { 
            List<SellerTypeIdentify> sellerTypeList = new List<SellerTypeIdentify>(); 
            sellerTypeList.Add(new SellerTypeIdentify { SellerTypeID = "00000001", SellerName = "Name0001" }); 
            sellerTypeList.Add(new SellerTypeIdentify { SellerTypeID = "00000002", SellerName = "Name0002" }); 
            sellerTypeList.Add(new SellerTypeIdentify { SellerTypeID = "00000003", SellerName = "Name0003" }); 
            return sellerTypeList; 
        } 
        public static List<SellerTypeIdentify> GetSuppData() 
        { 
            List<SellerTypeIdentify> sellerTypeList = new List<SellerTypeIdentify>(); 
            sellerTypeList.Add(new SellerTypeIdentify { SellerTypeID = "00000002", SellerName = "Name0001" }); 
            sellerTypeList.Add(new SellerTypeIdentify { SellerTypeID = "00000001", SellerName = "Name0002" }); 
            sellerTypeList.Add(new SellerTypeIdentify { SellerTypeID = "00000003", SellerName = "Name0003" }); 
            sellerTypeList.Add(new SellerTypeIdentify { SellerTypeID = "00000004", SellerName = "Name0004" }); 
            return sellerTypeList; 
        } 

就拿Distinct和SequenceEqual來說
[html] 
List<SellerTypeIdentify> sellerTypeMainList = new List<SellerTypeIdentify>(); 
           sellerTypeMainList = Program.GetMainData(); 
 
           List<SellerTypeIdentify> sellerTypeSuppList = new List<SellerTypeIdentify>(); 
           sellerTypeSuppList = Program.GetSuppData(); 
 
           int mainSellerCount = sellerTypeMainList.Distinct(new SellerTypeIdentifyComparer()).Count(); 
           int suppSellerCount = sellerTypeSuppList.Distinct(new SellerTypeIdentifyComparer()).Count(); 
           List<bool> xquery = new List<bool>(); 
           if (suppSellerCount <= mainSellerCount) 
           { 
               foreach (SellerTypeIdentify s in sellerTypeSuppList.Distinct(new SellerTypeIdentifyComparer()).OrderBy(x => x.SellerTypeID)) 
               { 
                   xquery.Add(sellerTypeMainList.OrderBy(x => x.SellerTypeID).Contains(s, new SellerTypeIdentifyComparer())); 
               } 
           } 
           else 
           { 
               Console.WriteLine("NOT CONTAINS1"); 
           } 
           if (xquery.Contains(false)) 
           { 
               Console.WriteLine("NOT CONTAINS2"); 
           } 
           bool IsEqual = sellerTypeMainList.OrderBy(x => x.SellerTypeID).SequenceEqual(sellerTypeSuppList.OrderBy(x => x.SellerTypeID), new SellerTypeIdentifyComparer()); 
           if (IsEqual) 
           { 
               Console.WriteLine("Equal"); 
           } 
           else 
           { 
               Console.WriteLine("Not Equal"); 
           } 

輸出結果如下:

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved