IEqualityComparer<T> インターフェイス

定義

オブジェクトの等価比較をサポートするメソッドを定義します。

``````generic <typename T>
public interface class IEqualityComparer``````
``public interface IEqualityComparer<in T>``
``public interface IEqualityComparer<T>``
``type IEqualityComparer<'T> = interface``
``Public Interface IEqualityComparer(Of In T)``
``Public Interface IEqualityComparer(Of T)``

型パラメーター

T

この型パラメーターは反変です。 つまり、指定した型、または弱い派生型のいずれかを使用することができます。 共変性および反変性の詳細については、「ジェネリックの共変性と反変性」をご覧ください。

例

``````using System;
using System.Collections.Generic;

static class Example
{
static void Main()
{
BoxEqualityComparer comparer = new();

Dictionary<Box, string> boxes = new(comparer);

Console.WriteLine(\$"The dictionary contains {boxes.Count} Box objects.");

{
try
{
}
catch (ArgumentException e)
{
}
}
}
}

class Box
{
public int Height { get; }
public int Length { get; }
public int Width { get; }

public Box(int height, int length, int width)
{
Height = height;
Length = length;
Width = width;
}

public override string ToString() => \$"({Height}, {Length}, {Width})";
}

class BoxEqualityComparer : IEqualityComparer<Box>
{
public bool Equals(Box? b1, Box? b2)
{
if (ReferenceEquals(b1, b2))
return true;

if (b2 is null || b1 is null)
return false;

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

public int GetHashCode(Box box) => box.Height ^ box.Length ^ box.Width;
}

// The example displays the following output:
//    Unable to add (4, 3, 4): An item with the same key has already been added.
//    The dictionary contains 2 Box objects.
``````
``````Imports System.Collections.Generic

Module Example
Public Sub Main()

Dim boxEqC As New BoxEqualityComparer()

Dim boxes As New Dictionary(Of Box, String)(boxEqC)

Dim redBox = New Box(4, 3, 4)

Dim blueBox = new Box(4, 3, 4)

Dim greenBox = new Box(3, 4, 3)
Console.WriteLine()

Console.WriteLine("The dictionary contains {0} Box objects.",
boxes.Count)
End Sub

Private Sub AddBox(dict As Dictionary(Of Box, String), box As Box, name As String)
Try
Catch e As ArgumentException
Console.WriteLine("Unable to add {0}: {1}", box, e.Message)
End Try
End Sub
End Module

Public Class Box
Private _Height As Integer
Private _Length As Integer
Private _Width As Integer

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

Public Property Height() As Integer
Get
Return _Height
End Get
Set(ByVal value As Integer)
_Height = value
End Set
End Property

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

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

Public Overrides Function ToString() As String
Return String.Format("({0}, {1}, {2})", _Height, _Length, _Width)
End Function
End Class

Class BoxEqualityComparer
Implements IEqualityComparer(Of Box)

Public Overloads Function Equals(ByVal b1 As Box, ByVal b2 As Box) _
As Boolean Implements IEqualityComparer(Of Box).Equals

If b1 Is Nothing AndAlso b2 Is Nothing Then
Return True
ElseIf b1 Is Nothing Or b2 Is Nothing Then
Return False
ElseIf b1.Height = b2.Height AndAlso b1.Length =
b2.Length AndAlso b1.Width = b2.Width Then
Return True
Else
Return False
End If
End Function

Public Overloads Function GetHashCode(ByVal bx As Box) _
As Integer Implements IEqualityComparer(Of Box).GetHashCode
Dim hCode As Integer = bx.Height Xor bx.Length Xor bx.Width
Return hCode.GetHashCode()
End Function

End Class
' The example displays the following output:
'    Unable to add (4, 3, 4): An item with the same key has already been added.
'
'    The dictionary contains 2 Box objects.
``````

注釈

このインターフェイスを使用すると、コレクションのカスタマイズされた等値比較を実装できます。 つまり、型 `T`の等価性の独自の定義を作成し、ジェネリック インターフェイスを受け入れるコレクション型でこの定義を IEqualityComparer<T> 使用することを指定できます。 .NET Frameworkでは、ジェネリック コレクション型のコンストラクターはこのインターフェイスをDictionary<TKey,TValue>受け入れます。

このインターフェイスの既定の実装は、 ジェネリック クラスの EqualityComparer<T> プロパティによってDefault提供されます。 クラスは StringComparer 型 の を実装しますIEqualityComparer<T>String

このインターフェイスでは、等価比較のみがサポートされます。 並べ替えと順序付けの比較のカスタマイズは、ジェネリック インターフェイスによって IComparer<T> 提供されます。

クラスは メソッドではなく メソッドをEqualityComparer<T>使用してIEquatable<T>.Equals等価性をIEqualityComparer<T>テストするため、インターフェイスをEqualityComparer<T>実装する代わりに Object.Equals クラスから派生することをお勧めします。 これは、 クラスおよび他の`Contains`ジェネリック コレクションの Dictionary<TKey,TValue>`IndexOf``LastIndexOf`、および `Remove` メソッドと一致します。

メソッド

 指定したオブジェクトが等しいかどうかを判断します。 指定したオブジェクトのハッシュ コードを返します。