IStructuralEquatable Rozhraní

Definice

Definuje metody pro podporu porovnávání strukturální shody objektů.

public interface class IStructuralEquatable
public interface IStructuralEquatable
type IStructuralEquatable = interface
Public Interface IStructuralEquatable
Odvozené

Příklady

Výchozí porovnávače rovnosti považuje EqualityComparer<Object>.Default.Equalsdvě NaN hodnoty za stejné. V některých případech však můžete chtít, aby porovnání NaN hodnot rovnosti vrátilo false, což značí, že hodnoty nelze porovnat. Následující příklad definuje NanComparer třídu, která implementuje IEqualityComparer rozhraní. Používá se v třetím příkladu jako argument pro metodu Equals(Object, IEqualityComparer) rozhraní, které řazené IStructuralEquatable kolekce členů implementují. Porovnává dvě Double nebo dvě Single hodnoty pomocí operátoru rovnosti. Předá hodnoty jakéhokoli jiného typu do výchozího porovnávače rovnosti.

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

Následující příklad vytvoří dva identické 3-řazené objekty, jejichž komponenty se skládají ze tří Double hodnot. Hodnota druhé komponenty je Double.NaN. Příklad pak zavolá metodu Tuple<T1,T2,T3>.Equals a třikrát zavolá metodu IStructuralEquatable.Equals . Poprvé předá výchozí porovnávací nástroj rovnosti vrácený EqualityComparer<T>.Default vlastností. Podruhé předá výchozí porovnávací nástroj rovnosti vrácený StructuralComparisons.StructuralEqualityComparer vlastností. Potřetí předá vlastní NanComparer objekt. Jak ukazuje výstup z příkladu, první tři volání metody vrátí true, zatímco čtvrté volání vrátí 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

Poznámky

Strukturální rovnost znamená, že dva objekty jsou si rovny, protože mají stejné hodnoty. Liší se od rovnosti odkazů, která označuje, že dva odkazy na objekt jsou stejné, protože odkazují na stejný fyzický objekt. Rozhraní IStructuralEquatable umožňuje implementovat přizpůsobená porovnání ke kontrole strukturální rovnosti objektů kolekce. To znamená, že můžete vytvořit vlastní definici strukturální rovnosti a zadat, aby se tato definice používala s typem kolekce, který přijímá IStructuralEquatable rozhraní. Rozhraní má dva členy: Equals, který testuje rovnost pomocí zadané IEqualityComparer implementace a GetHashCode, který vrací identické hash kódy pro objekty, které jsou si rovny.

Poznámka

Rozhraní IStructuralEquatable podporuje pouze vlastní porovnání pro strukturální rovnost. Rozhraní IStructuralComparable podporuje vlastní strukturální porovnání pro řazení a řazení.

Rozhraní .NET Framework také poskytuje výchozí porovnávače rovnosti, které jsou vráceny vlastnostmi EqualityComparer<T>.Default a StructuralComparisons.StructuralEqualityComparer . Další informace najdete v příkladu.

Obecné třídy řazené kolekce členů (Tuple<T1>, Tuple<T1,T2>, Tuple<T1,T2,T3>atd.) a Array třída poskytují explicitní implementace IStructuralEquatable rozhraní. Přetypováním (v jazyce C#) nebo převodem (v jazyce Visual Basic) aktuální instance pole nebo řazené kolekce členů na IStructuralEquatable hodnotu rozhraní a poskytnutím IEqualityComparer implementace jako argumentu pro metodu Equals můžete definovat vlastní porovnání rovnosti pro pole nebo kolekci.

Metody

Equals(Object, IEqualityComparer)

Určuje, zda je objekt strukturálně roven aktuální instanci.

GetHashCode(IEqualityComparer)

Vrátí kód hash pro aktuální instanci.

Platí pro

Viz také