Equality, Comparison, Hashing and Cloning

Is, Object.ReferenceEquals Same instance?

Equals(Object), IEquatable(Of T), Operator = Dictionary/HashSet keys (equal objects must have equal hashes)

IComparable(Of T).CompareTo, IComparer(Of T), Comparison(Of T) IEqualityComparer(Of T) Dictionary/LINQ Distinct

MemberwiseClone (shallow), copy constructors, serialization (deep)

Rule: if you override Equals, override GetHashCode. Use immutable fields in hash codes. Make Equals symmetric, transitive, and reflexive.

Public Class ProductByNameComparer
    Implements IEqualityComparer(Of Product)
    Public Overloads Function Equals(x As Product, y As Product) As Boolean Implements IEqualityComparer(Of Product).Equals
        Return String.Equals(x?.Name, y?.Name, StringComparison.OrdinalIgnoreCase)
    End Function
    Public Overloads Function GetHashCode(p As Product) As Integer Implements IEqualityComparer(Of Product).GetHashCode
        Return StringComparer.OrdinalIgnoreCase.GetHashCode(p.Name)
    End Function
End Class

Dim distinctProducts = products.Distinct(New ProductByNameComparer()).ToList()
products.Sort(Function(a, b) a.Price.CompareTo(b.Price))
Dim sorted = products.OrderBy(Function(p) p.Category).ThenByDescending(Function(p) p.Price).ToList()
Dim shallow = DirectCast(original.MemberwiseClone(), Product)   ' inside the class (Protected method)