![](/img/trans.png)
[英]IEqualityComparer<T> does not work with List<T>.Distinct() method
[英]Questions about IEqualityComparer<T> / List<T>.Distinct()
這是我剛剛寫的相等比較器,因為我想要一組包含實體的列表中的一組不同項目。
class InvoiceComparer : IEqualityComparer<Invoice>
{
public bool Equals(Invoice x, Invoice y)
{
// A
if (Object.ReferenceEquals(x, y)) return true;
// B
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) return false;
// C
return x.TxnID == y.TxnID;
}
public int GetHashCode(Invoice obj)
{
if (Object.ReferenceEquals(obj, null)) return 0;
return obj.TxnID2.GetHashCode();
}
}
Distinct
要求比較器而不是Func<T,T,bool>
? 如果我願意,可以將(C)替換為
return GetHashCode(x) == GetHashCode(y)
NullReferenceException
。 但是,如果Invoice
是結構,則它們既不必要又慢 。 A
是確保兩個對象都位於同一內存地址的簡單且快速的方法,因此它們都引用同一對象。 B
如果引用之一為空-顯然,進行相等比較沒有任何意義 C
否,有時GetHashCode()可以為不同的對象返回相同的值( 哈希沖突 ),因此您應該進行相等比較 關於不同對象的相同哈希碼值, MSDN :
如果兩個對象比較相等,則每個對象的GetHashCode方法必須返回相同的值。 但是,如果兩個對象的比較不相等,則兩個對象的GetHashCode方法不必返回不同的值。
Distinct()基本上適用於術語“不相等”。 因此,如果您的列表包含非基本類型,則必須實現自己的EqualityComparer。
在A處,檢查對象是否相同。 如果兩個對象相等,則它們不必相同,但是如果它們相同,則可以確保它們相等。 因此,在某些情況下,A部分可以提高方法的有效性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.