IEqualityComparer<T> IEqualityComparer<T> IEqualityComparer<T> IEqualityComparer<T> Interface

Definition

Definiert Methoden, die den Vergleich von Objekten auf Gleichheit unterstützen.Defines methods to support the comparison of objects for equality.

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

Typparameter

T

Der Typ der zu vergleichenden Objekte.The type of objects to compare.

Abgeleitet

Beispiele

Das folgende Beispiel fügt benutzerdefinierte Box Objekte Wörterbüchern.The following example adds custom Box objects to a dictionary collection. Die Box Objekte gelten als gleich, wenn ihre Dimensionen gleich sind.The Box objects are considered equal if their dimensions are the same.

using System;
using System.Collections.Generic;

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

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

      var redBox = new Box(4, 3, 4);
      AddBox(boxes, redBox, "red");
      
      var blueBox = new Box(4, 3, 4);
      AddBox(boxes, blueBox, "blue");
      
      var greenBox = new Box(3, 4, 3);
      AddBox(boxes, greenBox, "green");
      Console.WriteLine();
      
      Console.WriteLine("The dictionary contains {0} Box objects.",
                        boxes.Count);
   }

   private static void AddBox(Dictionary<Box, String> dict, Box box, String name)
   {
      try {
         dict.Add(box, name);
      }
      catch (ArgumentException e) {
         Console.WriteLine("Unable to add {0}: {1}", box, e.Message);
      }
   }
}

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; }

    public override String ToString()
    {
       return String.Format("({0}, {1}, {2})", Height, Length, Width);
    }
}


class BoxEqualityComparer : IEqualityComparer<Box>
{
    public bool Equals(Box b1, Box b2)
    {
        if (b2 == null && b1 == null)
           return true;
        else if (b1 == null || b2 == null)
           return false;
        else if(b1.Height == b2.Height && b1.Length == b2.Length
                            && b1.Width == b2.Width)
            return true;
        else
            return false;
    }

    public int GetHashCode(Box bx)
    {
        int hCode = bx.Height ^ bx.Length ^ bx.Width;
        return hCode.GetHashCode();
    }
}
// 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.

Hinweise

Diese Schnittstelle ermöglicht die Implementierung von benutzerdefinierten Gleichheitsvergleich für Sammlungen.This interface allows the implementation of customized equality comparison for collections. Also können eine eigene Definition der Gleichheit für den Typ T, und angeben, dass diese Definition mit einem Auflistungstyp verwendet wird, akzeptiert die IEqualityComparer<T> generische Schnittstelle.That is, you can create your own definition of equality for type T, and specify that this definition be used with a collection type that accepts the IEqualityComparer<T> generic interface. In der.NET Framework-Konstruktoren der Dictionary<TKey,TValue> generischen Auflistungstyp dieser Schnittstelle.In the .NET Framework, constructors of the Dictionary<TKey,TValue> generic collection type accept this interface.

Eine standardmäßige Implementierung dieser Schnittstelle erfolgt über die Default -Eigenschaft eines der EqualityComparer<T> generische Klasse.A default implementation of this interface is provided by the Default property of the EqualityComparer<T> generic class. Die StringComparer -Klasse implementiert IEqualityComparer<T> vom Typ String.The StringComparer class implements IEqualityComparer<T> of type String.

Diese Schnittstelle unterstützt nur Übereinstimmungsvergleiche.This interface supports only equality comparisons. Die Anpassung von Vergleichen für Sortier- und Ordnungszwecke der IComparer<T> generischen Schnittstelle.Customization of comparisons for sorting and ordering is provided by the IComparer<T> generic interface.

Es wird empfohlen, dass Sie eine Ableitung aus der EqualityComparer<T> Klasse anstatt zu implementieren die IEqualityComparer<T> Schnittstelle, da die EqualityComparer<T> Klasse Tests für Gleichheit mit der IEquatable<T>.Equals -Methode anstelle der Object.Equals Methode.We recommend that you derive from the EqualityComparer<T> class instead of implementing the IEqualityComparer<T> interface, because the EqualityComparer<T> class tests for equality using the IEquatable<T>.Equals method instead of the Object.Equals method. Dies ist konsistent mit der Contains, IndexOf, LastIndexOf, und Remove Methoden der Dictionary<TKey,TValue> -Klasse und der andere generischen Auflistungen.This is consistent with the Contains, IndexOf, LastIndexOf, and Remove methods of the Dictionary<TKey,TValue> class and other generic collections.

Methoden

Equals(T, T) Equals(T, T) Equals(T, T) Equals(T, T)

Bestimmt, ob die angegebenen Objekte gleich sind.Determines whether the specified objects are equal.

GetHashCode(T) GetHashCode(T) GetHashCode(T) GetHashCode(T)

Gibt einen Hashcode für das angegebene Objekt zurück.Returns a hash code for the specified object.

Gilt für:

Siehe auch