IEqualityComparer<T> Interface

Definitie

Definieert methoden ter ondersteuning van de vergelijking van objecten voor gelijkheid.

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)

Type parameters

T

Het type objecten dat moet worden vergeleken.

Dit type parameter is contravariant. U kunt het type dat u hebt opgegeven gebruiken of een type dat minder is afgeleid. Zie Covariantie en Contravariantie in Algemene typen voor meer informatie over covariantie en contravariantie.
Afgeleid

Voorbeelden

In het volgende voorbeeld worden aangepaste Box objecten toegevoegd aan een woordenlijstverzameling. De Box objecten worden als gelijk beschouwd als hun afmetingen hetzelfde zijn.

using System;
using System.Collections.Generic;

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

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

        AddBox(new Box(4, 3, 4), "red");
        AddBox(new Box(4, 3, 4), "blue");
        AddBox(new Box(3, 4, 3), "green");

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

        void AddBox(Box box, string name)
        {
            try
            {
                boxes.Add(box, name);
            }
            catch (ArgumentException e)
            {
                Console.WriteLine($"Unable to add {box}: {e.Message}");
            }
        }
    }
}

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)
      AddBox(boxes, redBox, "red")

      Dim blueBox = new Box(4, 3, 4)
      AddBox(boxes, blueBox, "blue")

      Dim greenBox = new Box(3, 4, 3)
      AddBox(boxes, greenBox, "green")
      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
         dict.Add(box, name)
      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.

Opmerkingen

Met deze interface kunt u aangepaste gelijkheidsvergelijking voor verzamelingen implementeren. Dat wil zeggen dat u uw eigen definitie van gelijkheid voor het type Tkunt maken en kunt opgeven dat deze definitie wordt gebruikt met een verzamelingstype dat de IEqualityComparer<T> algemene interface accepteert. In het .NET Framework accepteren constructors van het Dictionary<TKey,TValue> algemene verzamelingstype deze interface.

Een standaard implementatie van deze interface wordt geleverd door de Default eigenschap van de EqualityComparer<T> algemene klasse. De StringComparer klasse implementeert IEqualityComparer<T> van het type String.

Deze interface ondersteunt alleen gelijkheidsvergelijkingen. Aanpassing van vergelijkingen voor sorteren en ordenen wordt geleverd door de IComparer<T> algemene interface.

We raden u aan om af te leiden van de EqualityComparer<T> klasse in plaats van de IEqualityComparer<T> interface te implementeren, omdat de EqualityComparer<T> klasse test op gelijkheid met behulp van de IEquatable<T>.Equals methode in plaats van de Object.Equals methode. Dit is consistent met de Containsmethoden IndexOfLastIndexOfvan Remove de Dictionary<TKey,TValue> klasse en andere algemene verzamelingen.

Methoden

Name Description
Equals(T, T)

Bepaalt of de opgegeven objecten gelijk zijn.

GetHashCode(T)

Retourneert een hash-code voor het opgegeven object.

Van toepassing op

Zie ook