先給出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");
}
輸出結果如下: