簡體   English   中英

關於IEqualityComparer的問題 <T> /清單 <T> 。不同()

[英]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();
        }
    }
  1. 為什么Distinct要求比較器而不是Func<T,T,bool>
  2. (A)和(B)除了優化之外是否還有其他功能?是否存在由於比較參考的細微之處而無法按預期方式運行的情況?
  3. 如果我願意,可以將(C)替換為

    return GetHashCode(x) == GetHashCode(y)

  1. 因此它可以使用哈希碼為O(n)而不是O(n 2
  2. (一)是一種優化。
    (B)是必需的; 否則,將拋出NullReferenceException 但是,如果Invoice是結構,則它們既不必要又
  3. 否。 哈希碼不是唯一的
  • A是確保兩個對象都位於同一內存地址的簡單且快速的方法,因此它們都引用同一對象。
  • B如果引用之一為空-顯然,進行相等比較沒有任何意義
  • C否,有時GetHashCode()可以為不同的對象返回相同的值( 哈希沖突 ),因此您應該進行相等比較

關於不同對象的相同哈希碼值, MSDN

如果兩個對象比較相等,則每個對象的GetHashCode方法必須返回相同的值。 但是,如果兩個對象的比較不相等,則兩個對象的GetHashCode方法不必返回不同的值。

Distinct()基本上適用於術語“不相等”。 因此,如果您的列表包含非基本類型,則必須實現自己的EqualityComparer。

在A處,檢查對象是否相同。 如果兩個對象相等,則它們不必相同,但是如果它們相同,則可以確保它們相等。 因此,在某些情況下,A部分可以提高方法的有效性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM