Udostępnij za pośrednictwem


IStructuralEquatable Interfejs

Definicja

Definiuje metody do obsługi porównania obiektów pod kątem równości strukturalnej.

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

Przykłady

Domyślny porównujący równości, EqualityComparer<Object>.Default.Equals, uwzględnia dwie NaN wartości jako równe. Jednak w niektórych przypadkach można chcieć, aby porównanie NaN wartości równości zwracało falsewartość , co oznacza, że nie można porównać wartości. W poniższym przykładzie zdefiniowano klasę NanComparer , która implementuje IEqualityComparer interfejs. Jest on używany przez trzeci przykład jako argument Equals(Object, IEqualityComparer) metody interfejsu IStructuralEquatable implementowania krotki. Porównuje dwie Double lub dwie Single wartości przy użyciu operatora równości. Przekazuje wartości dowolnego innego typu do domyślnego porównania równości.

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

Poniższy przykład obejmuje tworzenie dwóch identycznych obiektów krotki 3, których składniki składają się z trzech Double wartości. Wartość drugiego składnika to Double.NaN. Następnie przykład wywołuje metodę Tuple<T1,T2,T3>.Equals i wywołuje metodę IStructuralEquatable.Equals trzy razy. Po raz pierwszy przekazuje domyślny porównujący równości zwracany przez EqualityComparer<T>.Default właściwość . Po raz drugi przekazuje domyślny porównujący równości zwracany przez StructuralComparisons.StructuralEqualityComparer właściwość . Po raz trzeci przekazuje obiekt niestandardowy NanComparer . Jak pokazano w danych wyjściowych z przykładu, pierwsze trzy wywołania metody zwracają truewartość , natomiast czwarte wywołanie zwraca wartość 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

Uwagi

Równość strukturalna oznacza, że dwa obiekty są równe, ponieważ mają równe wartości. Różni się od równości odwołań, co oznacza, że dwa odwołania do obiektów są równe, ponieważ odwołują się do tego samego obiektu fizycznego. Interfejs IStructuralEquatable umożliwia zaimplementowanie dostosowanych porównań w celu sprawdzenia strukturalnej równości obiektów kolekcji. Oznacza to, że można utworzyć własną definicję równości strukturalnej i określić, że ta definicja ma być używana z typem kolekcji, który akceptuje IStructuralEquatable interfejs. Interfejs ma dwa elementy członkowskie: Equals, które testują równość przy użyciu określonej IEqualityComparer implementacji, i GetHashCode, który zwraca identyczne kody skrótu dla obiektów, które są równe.

Uwaga

Interfejs IStructuralEquatable obsługuje tylko niestandardowe porównania pod kątem równości strukturalnej. Interfejs IStructuralComparable obsługuje niestandardowe porównania strukturalne do sortowania i porządkowania.

Program .NET Framework udostępnia również domyślne porównania równości, które są zwracane przez EqualityComparer<T>.Default właściwości i StructuralComparisons.StructuralEqualityComparer . Aby uzyskać więcej informacji, zobacz przykład.

Ogólne klasy krotki (, , i tak dalej) i Array klasy zapewniają jawne implementacje interfejsuIStructuralEquatable. Tuple<T1,T2,T3>Tuple<T1,T2>Tuple<T1> Rzutowanie (w języku C#) lub konwertowanie (w Języku Visual Basic) bieżącego wystąpienia tablicy lub krotki na IStructuralEquatable wartość interfejsu i podanie IEqualityComparer implementacji jako argumentu Equals metody można zdefiniować niestandardowe porównanie równości dla tablicy lub kolekcji.

Metody

Equals(Object, IEqualityComparer)

Określa, czy obiekt jest strukturalnie równy bieżącemu wystąpieniu.

GetHashCode(IEqualityComparer)

Zwraca kod skrótu dla bieżącego wystąpienia.

Dotyczy

Zobacz też