Here is the equality comparer I just wrote because I wanted a distinct set of items from a list containing entities.
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
require a comparer as opposed to a Func<T,T,bool>
?If I wanted to, could I replace (C) with
return GetHashCode(x) == GetHashCode(y)
NullReferenceException
.
If Invoice
is a struct, however, they're both unnecessary and slower.A
is a simple and quick way to ensure that both objects located at the same memory address so both references the same object.B
- if one of the references is null - obviuosly it does not make any sense doing equality comparisionC
- no, sometimes GetHashCode() can return the same value for different objects (hash collision) so you should do equality comparisonRegarding the same hash code value for different objects, MSDN:
If two objects compare as equal, the GetHashCode method for each object must return the same value. However, if two objects do not compare as equal, the GetHashCode methods for the two object do not have to return different values.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With