5

これは、エンティティを含むリストから個別のアイテムセットが必要だったため、先ほど作成した等式比較ツールです。

    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)

4

3 に答える 3

4
  1. したがって、ハッシュコードを使用して、O(n 2)ではなくO(n)にすることができます。
  2. (A)は最適化です。
    (B)必要です。それ以外の場合は、をスローしNullReferenceExceptionます。ただし、が構造体の場合Invoice、それらは不要であり、低速です。
  3. いいえ 。ハッシュコードは一意ではありません
于 2011-12-15T21:25:24.443 に答える
1
  • A は、両方のオブジェクトが同じメモリアドレスに配置され、両方が同じオブジェクトを参照するようにするための簡単で迅速な方法です。
  • B-参照の1つがnullの場合-明らかに、同等の比較を行うことは意味がありません
  • C-いいえ、GetHashCode()が異なるオブジェクトに対して同じ値を返す場合があるため(ハッシュ衝突)、同等性の比較を行う必要があります

異なるオブジェクトの同じハッシュコード値に関して、MSDN

2つのオブジェクトが等しいと比較される場合、各オブジェクトのGetHashCodeメソッドは同じ値を返す必要があります。ただし、2つのオブジェクトが同等であると比較されない場合、2つのオブジェクトのGetHashCodeメソッドは異なる値を返す必要はありません。

于 2011-12-15T21:28:40.917 に答える
0

Distinct()は、基本的に「等しくない」という用語で機能します。したがって、リストに非プリミティブタイプが含まれている場合は、独自のEqualityComparerを実装する必要があります。

Aでは、オブジェクトが同一であるかどうかを確認します。2つのオブジェクトが等しい場合、それらは同一である必要はありませんが、それらが同一である場合、それらが等しいことを確認できます。したがって、A部分は、場合によってはメソッドの有効性を高めることができます。

于 2011-12-15T21:31:09.430 に答える