Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

EqualityComparer<T> Class

Definition

Namespace:
System.Collections.Generic
Assemblies:
mscorlib.dll, System.Collections.dll
Assemblies:
netstandard.dll, System.Collections.dll
Assembly:
System.Collections.dll
Assembly:
mscorlib.dll
Assembly:
netstandard.dll
Source:
EqualityComparer.cs
Source:
EqualityComparer.cs
Source:
EqualityComparer.cs
Source:
EqualityComparer.cs
Source:
EqualityComparer.cs

Important

Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.

Provides a base class for implementations of the IEqualityComparer<T> generic interface.

generic <typename T>
public ref class EqualityComparer abstract : System::Collections::Generic::IEqualityComparer<T>, System::Collections::IEqualityComparer
public abstract class EqualityComparer<T> : System.Collections.Generic.IEqualityComparer<T>, System.Collections.IEqualityComparer
[System.Serializable]
public abstract class EqualityComparer<T> : System.Collections.Generic.IEqualityComparer<T>, System.Collections.IEqualityComparer
type EqualityComparer<'T> = class
 interface IEqualityComparer<'T>
 interface IEqualityComparer
[<System.Serializable>]
type EqualityComparer<'T> = class
 interface IEqualityComparer
 interface IEqualityComparer<'T>
Public MustInherit Class EqualityComparer(Of T)
Implements IEqualityComparer, IEqualityComparer(Of T)

Type Parameters

T

The type of objects to compare.

Inheritance
EqualityComparer<T>
Attributes
Implements

Examples

The following example creates a dictionary collection of objects of type Box with an equality comparer. Two boxes are considered equal if their dimensions are the same. It then adds the boxes to the collection.

The dictionary is recreated with an equality comparer that defines equality in a different way: Two boxes are considered equal if their volumes are the same.

using System;
using System.Collections.Generic;

class Program
{
 static Dictionary<Box, String> boxes;

 static void Main()
 {
 BoxSameDimensions boxDim = new BoxSameDimensions();
 boxes = new Dictionary<Box, string>(boxDim);

 Console.WriteLine("Boxes equality by dimensions:");
 Box redBox = new Box(8, 4, 8);
 Box greenBox = new Box(8, 6, 8);
 Box blueBox = new Box(8, 4, 8);
 Box yellowBox = new Box(8, 8, 8);
 AddBox(redBox, "red");
 AddBox(greenBox, "green");
 AddBox(blueBox, "blue");
 AddBox(yellowBox, "yellow");

 Console.WriteLine();
 Console.WriteLine("Boxes equality by volume:");

 BoxSameVolume boxVolume = new BoxSameVolume();
 boxes = new Dictionary<Box, string>(boxVolume);
 Box pinkBox = new Box(8, 4, 8);
 Box orangeBox = new Box(8, 6, 8);
 Box purpleBox = new Box(4, 8, 8);
 Box brownBox = new Box(8, 8, 4);
 AddBox(pinkBox, "pink");
 AddBox(orangeBox, "orange");
 AddBox(purpleBox, "purple");
 AddBox(brownBox, "brown");
 }

 public static void AddBox(Box bx, string name)
 {
 try
 {
 boxes.Add(bx, name);
 Console.WriteLine("Added {0}, Count = {1}, HashCode = {2}",
 name, boxes.Count.ToString(), bx.GetHashCode());
 }
 catch (ArgumentException)
 {
 Console.WriteLine("A box equal to {0} is already in the collection.", name);
 }
 }
}

public class Box
{
 public Box(int h, int l, int w)
 {
 this.Height = h;
 this.Length = l;
 this.Width = w;
 }
 public int Height { get; set; }
 public int Length { get; set; }
 public int Width { get; set; }
}

class BoxSameDimensions : EqualityComparer<Box>
{
 public override bool Equals(Box b1, Box b2)
 {
 if (b1 == null && b2 == null)
 return true;
 else if (b1 == null || b2 == null)
 return false;

 return (b1.Height == b2.Height &&
 b1.Length == b2.Length &&
 b1.Width == b2.Width);
 }

 public override int GetHashCode(Box bx)
 {
 int hCode = bx.Height ^ bx.Length ^ bx.Width;
 return hCode.GetHashCode();
 }
}

class BoxSameVolume : EqualityComparer<Box>
{
 public override bool Equals(Box b1, Box b2)
 {
 if (b1 == null && b2 == null)
 return true;
 else if (b1 == null || b2 == null)
 return false;

 return (b1.Height * b1.Width * b1.Length ==
 b2.Height * b2.Width * b2.Length);
 }

 public override int GetHashCode(Box bx)
 {
 int hCode = bx.Height * bx.Length * bx.Width;
 return hCode.GetHashCode();
 }
}
/* This example produces an output similar to the following:
 *
 Boxes equality by dimensions:
 Added red, Count = 1, HashCode = 46104728
 Added green, Count = 2, HashCode = 12289376
 A box equal to blue is already in the collection.
 Added yellow, Count = 3, HashCode = 43495525

 Boxes equality by volume:
 Added pink, Count = 1, HashCode = 55915408
 Added orange, Count = 2, HashCode = 33476626
 A box equal to purple is already in the collection.
 A box equal to brown is already in the collection.
 *
*/
'Imports System.Collections
Imports System.Collections.Generic

Module Program
 Dim boxes As Dictionary(Of Box, [String])

 Public Sub Main(ByVal args As String())

 Dim boxDim As New BoxSameDimensions()
 boxes = New Dictionary(Of Box, String)(boxDim)

 Console.WriteLine("Boxes equality by dimensions:")
 Dim redBox As New Box(8, 4, 8)
 Dim greenBox As New Box(8, 6, 8)
 Dim blueBox As New Box(8, 4, 8)
 Dim yellowBox As New Box(8, 8, 8)
 AddBox(redBox, "red")
 AddBox(greenBox, "green")
 AddBox(blueBox, "blue")
 AddBox(yellowBox, "yellow")

 Console.WriteLine()
 Console.WriteLine("Boxes equality by volume:")

 Dim boxVolume As New BoxSameVolume()
 boxes = New Dictionary(Of Box, String)(boxVolume)
 Dim pinkBox As New Box(8, 4, 8)
 Dim orangeBox As New Box(8, 6, 8)
 Dim purpleBox As New Box(4, 8, 8)
 Dim brownBox As New Box(8, 8, 4)
 AddBox(pinkBox, "pink")
 AddBox(orangeBox, "orange")
 AddBox(purpleBox, "purple")
 AddBox(brownBox, "brown")
 End Sub

 Public Sub AddBox(ByVal bx As Box, ByVal name As String)
 Try
 boxes.Add(bx, name)
 Console.WriteLine("Added {0}, Count = {1}, HashCode = {2}", _
 name, boxes.Count.ToString(), bx.GetHashCode())
 Catch generatedExceptionName As ArgumentException
 Console.WriteLine("A box equal to {0} is already in the collection.", name)
 End Try
 End Sub
End Module

Public Class Box
 Public Sub New(ByVal h As Integer, ByVal l As Integer, ByVal w As Integer)
 Me.Height = h
 Me.Length = l
 Me.Width = w
 End Sub
 
 Private _Height As Integer
 Public Property Height() As Integer
 Get
 Return _Height
 End Get
 Set(ByVal value As Integer)
 _Height = value
 End Set
 End Property

 Private _Length As Integer
 Public Property Length() As Integer
 Get
 Return _Length
 End Get
 Set(ByVal value As Integer)
 _Length = value
 End Set
 End Property

 Private _Width As Integer
 Public Property Width() As Integer
 Get
 Return _Width
 End Get
 Set(ByVal value As Integer)
 _Width = value
 End Set
 End Property
End Class

Class BoxSameDimensions : Inherits EqualityComparer(Of Box)
 Public Overloads Overrides Function Equals(ByVal b1 As Box, _
 ByVal b2 As Box) As Boolean
 If b1 Is Nothing AndAlso b2 Is Nothing Then
 Return True
 Else If b1 Is Nothing OrElse b2 Is Nothing Then
 Return False
 End If

 Return (b1.Height = b2.Height AndAlso b1.Length = b2.Length _
 AndAlso b1.Width = b2.Width)
 End Function

 Public Overloads Overrides Function GetHashCode(ByVal bx As Box) As Integer
 Dim hCode As Integer = bx.Height Xor bx.Length Xor bx.Width
 Return hCode.GetHashCode()
 End Function
End Class

Class BoxSameVolume : Inherits EqualityComparer(Of Box)
 Public Overloads Overrides Function Equals(ByVal b1 As Box, _
 ByVal b2 As Box) As Boolean
 If b1 Is Nothing AndAlso b2 Is Nothing Then
 Return True
 Else If b1 Is Nothing OrElse b2 Is Nothing Then
 Return False
 End If

 Return (b1.Height * b1.Width * b1.Length = _
 b2.Height * b2.Width * b2.Length)
 End Function

 Public Overloads Overrides Function GetHashCode(ByVal bx As Box) As Integer
 Dim hCode As Integer = bx.Height * bx.Length * bx.Width
 Return hCode.GetHashCode()
 End Function
End Class
' This example produces an output similar to the following:
' * 
' Boxes equality by dimensions:
' Added red, Count = 1, HashCode = 46104728
' Added green, Count = 2, HashCode = 12289376
' A box equal to blue is already in the collection.
' Added yellow, Count = 3, HashCode = 43495525
'
' Boxes equality by volume:
' Added pink, Count = 1, HashCode = 55915408
' Added orange, Count = 2, HashCode = 33476626
' A box equal to purple is already in the collection.
' A box equal to brown is already in the collection.
' * 
'

Remarks

Derive from this class to provide a custom implementation of the IEqualityComparer<T> generic interface for use with collection classes such as the Dictionary<TKey,TValue> generic class, or with methods such as List<T>.Sort.

The Default property checks whether type T implements the System.IEquatable<T> generic interface and, if so, returns an EqualityComparer<T> that invokes the implementation of the IEquatable<T>.Equals method. Otherwise, it returns an EqualityComparer<T>, as provided by T.

In .NET 8 and later versions, we recommend using the EqualityComparer<T>.Create(Func<T,T,Boolean>, Func<T,Int32>) method to create instances of this type.

Constructors

Name Description
EqualityComparer<T>()

Initializes a new instance of the EqualityComparer<T> class.

Properties

Name Description
Default

Returns a default equality comparer for the type specified by the generic argument.

Methods

Name Description
Create(Func<T,T,Boolean>, Func<T,Int32>)

Creates an EqualityComparer<T> by using the specified delegates as the implementation of the comparer's Equals(T, T) and GetHashCode(T) methods.

Create<TKey>(Func<T,TKey>, IEqualityComparer<TKey>)
Equals(Object)

Determines whether the specified object is equal to the current object.

(Inherited from Object)
Equals(T, T)

When overridden in a derived class, determines whether two objects of type T are equal.

GetHashCode()

Serves as the default hash function.

(Inherited from Object)
GetHashCode(T)

When overridden in a derived class, serves as a hash function for the specified object for hashing algorithms and data structures, such as a hash table.

GetType()

Gets the Type of the current instance.

(Inherited from Object)
MemberwiseClone()

Creates a shallow copy of the current Object.

(Inherited from Object)
ToString()

Returns a string that represents the current object.

(Inherited from Object)

Explicit Interface Implementations

Name Description
IEqualityComparer.Equals(Object, Object)

Determines whether the specified objects are equal.

IEqualityComparer.GetHashCode(Object)

Returns a hash code for the specified object.

Applies to

See also


Feedback

Was this page helpful?