IStructuralEquatable Schnittstelle

Definition

Definiert Methoden zur Unterstützung der strukturellen Gleichheitsüberprüfung von Objekten.

public interface class IStructuralEquatable
public interface IStructuralEquatable
type IStructuralEquatable = interface
Public Interface IStructuralEquatable
Abgeleitet

Beispiele

Der Standard gleichheitsvergleicher, EqualityComparer<Object>.Default.Equalsbetrachtet zwei NaN Werte als gleich. In einigen Fällen können Sie jedoch den Vergleich der Werte für NaN die Gleichheit zurückgeben false, was angibt, dass die Werte nicht verglichen werden können. Im folgenden Beispiel wird eine NanComparer -Klasse definiert, die die IEqualityComparer -Schnittstelle implementiert. Es wird vom dritten Beispiel als Argument zur Methode der IStructuralEquatable Schnittstelle verwendet, die Equals(Object, IEqualityComparer) tuples implementiert. Sie vergleicht zwei oder zwei Double Single Werte mithilfe des Gleichheitsoperators. Sie übergibt Werte eines beliebigen anderen Typs an den Standardgleichgleich.

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

public class NanComparer : IEqualityComparer
{
   public new bool Equals(object x, object y)
   {
      if (x is float)
         return (float) x == (float) y;
      else if (x is double)
         return (double) x == (double) y;
      else
         return EqualityComparer<object>.Default.Equals(x, y);
   }

   public int GetHashCode(object obj)
   {
      return EqualityComparer<object>.Default.GetHashCode(obj);
   }
}
Imports System.Collections
Imports System.Collections.Generic

Public Class NanComparer : Implements IEqualityComparer
   Public Overloads Function Equals(x As Object, y As Object) As Boolean _
          Implements IEqualityComparer.Equals
      If TypeOf x Is Single Then
         Return CSng(x) = CSng(y)
      ElseIf TypeOf x Is Double Then
         Return CDbl(x) = CDbl(y)
      Else
         Return EqualityComparer(Of Object).Default.Equals(x, y)
      End If
   End Function
   
   Public Overloads Function GetHashCode(obj As Object) As Integer _
          Implements IEqualityComparer.GetHashCode
      Return EqualityComparer(Of Object).Default.GetHashCode(obj)
   End Function
End Class

Im folgenden Beispiel werden zwei identische 3-Tuple-Objekte erstellt, deren Komponenten aus drei Double Werten bestehen. Der Wert der zweiten Komponente ist Double.NaN. Im Beispiel wird dann die Tuple<T1,T2,T3>.Equals IStructuralEquatable.Equals Methode aufgerufen, und die Methode wird dreimal aufgerufen. Beim ersten Mal übergibt er den Standardgleichvergleich, der von der EqualityComparer<T>.Default Eigenschaft zurückgegeben wird. Das zweite Mal übergibt es den Standardgleichvergleich, der von der StructuralComparisons.StructuralEqualityComparer Eigenschaft zurückgegeben wird. Das dritte Mal übergibt es das benutzerdefinierte NanComparer Objekt. Wie die Ausgabe aus dem Beispiel gezeigt wird, wird die erste drei Methode zurückgegeben true, während der vierte Aufruf zurückgibt false.

public class Example
{
   public static void Main()
   {
      var t1 = Tuple.Create(12.3, Double.NaN, 16.4);
      var t2 = Tuple.Create(12.3, Double.NaN, 16.4);

      // Call default Equals method.
      Console.WriteLine(t1.Equals(t2));

      IStructuralEquatable equ = t1;
      // Call IStructuralEquatable.Equals using default comparer.
      Console.WriteLine(equ.Equals(t2, EqualityComparer<object>.Default));

      // Call IStructuralEquatable.Equals using
      // StructuralComparisons.StructuralEqualityComparer.
      Console.WriteLine(equ.Equals(t2,
                        StructuralComparisons.StructuralEqualityComparer));

      // Call IStructuralEquatable.Equals using custom comparer.
      Console.WriteLine(equ.Equals(t2, new NanComparer()));
   }
}
// The example displays the following output:
//       True
//       True
//       True
//       False
Module Example
   Public Sub Main()
      Dim t1 = Tuple.Create(12.3, Double.NaN, 16.4)
      Dim t2 = Tuple.Create(12.3, Double.NaN, 16.4)
      
      ' Call default Equals method.
      Console.WriteLine(t1.Equals(t2))
      
      Dim equ As IStructuralEquatable = t1
      ' Call IStructuralEquatable.Equals using default comparer.
      Console.WriteLine(equ.Equals(t2, EqualityComparer(Of Object).Default))
      
      ' Call IStructuralEquatable.Equals using 
      ' StructuralComparisons.StructuralEqualityComparer.
      Console.WriteLine(equ.Equals(t2, 
                        StructuralComparisons.StructuralEqualityComparer))
      
      ' Call IStructuralEquatable.Equals using custom comparer.
      Console.WriteLine(equ.Equals(t2, New NanComparer))
   End Sub
End Module
' The example displays the following output:
'       True
'       True
'       True
'       False

Hinweise

Strukturgleichheit bedeutet, dass zwei Objekte gleich sind, weil sie gleiche Werte haben. Es unterscheidet sich von der Referenzgleichheit, die angibt, dass zwei Objektbezüge gleich sind, da sie auf das gleiche physische Objekt verweisen. Mit der IStructuralEquatable Schnittstelle können Sie angepasste Vergleiche implementieren, um die strukturelle Gleichheit von Auflistungsobjekten zu überprüfen. Das heißt, Sie können ihre eigene Definition der strukturellen Gleichheit erstellen und angeben, dass diese Definition mit einem Auflistungstyp verwendet wird, der die IStructuralEquatable Schnittstelle akzeptiert. Die Schnittstelle verfügt über zwei Elemente: Equals, die die Gleichheit mithilfe einer angegebenen IEqualityComparer Implementierung testen und GetHashCode, die identische Hashcodes für Objekte zurückgibt, die gleich sind.

Hinweis

Die IStructuralEquatable Schnittstelle unterstützt nur benutzerdefinierte Vergleiche für strukturelle Gleichheit. Die IStructuralComparable Schnittstelle unterstützt benutzerdefinierte strukturelle Vergleiche für sortierung und Reihenfolge.

Die .NET Framework bietet auch Standardgleiche, die von den und StructuralComparisons.StructuralEqualityComparer eigenschaften EqualityComparer<T>.Default zurückgegeben werden. Weitere Informationen finden Sie unter Beispiel:

Die generischen Tupleklassen (Tuple<T1>, Tuple<T1,T2>, Tuple<T1,T2,T3>usw.) und die Array Klasse bieten explizite Implementierungen der IStructuralEquatable Schnittstelle. Indem Sie (in C#) oder (in Visual Basic) die aktuelle Instanz eines Arrays oder Tuples in einen IStructuralEquatable Schnittstellenwert umwandeln und Ihre IEqualityComparer Implementierung als Argument für die Methode bereitstellen, können Sie einen benutzerdefinierten Gleichheitsvergleich für das Array oder die Equals Auflistung definieren.

Methoden

Equals(Object, IEqualityComparer)

Bestimmt, ob die Struktur eines Objekt und der aktuellen Instanz gleich ist.

GetHashCode(IEqualityComparer)

Gibt einen Hashcode für die aktuelle Instanz zurück.

Gilt für:

Siehe auch