Поделиться через


IStructuralEquatable Интерфейс

Определение

Определяет методы, поддерживающие сравнение объектов на предмет структурного равенства.

public interface class IStructuralEquatable
public interface IStructuralEquatable
type IStructuralEquatable = interface
Public Interface IStructuralEquatable
Производный

Примеры

Компаратор EqualityComparer<Object>.Default.Equalsравенства по умолчанию считает два NaN значения равными. Однако в некоторых случаях может потребоваться, чтобы сравнение значений NaN для равенства возвращалось false, что указывает на невозможность сравнения значений. В следующем примере определяется класс NanComparer , реализующий интерфейс IEqualityComparer . Он используется в третьем примере в качестве аргумента Equals(Object, IEqualityComparer) метода интерфейса, реализуемого IStructuralEquatable кортежами. Он сравнивает два Double или два Single значения с помощью оператора равенства. Он передает значения любого другого типа в компаратор равенства по умолчанию.

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

В следующем примере создаются два идентичных объекта с тремя кортежами, компоненты которых состоят из трех Double значений. Значение второго компонента равно Double.NaN. Затем в примере вызывается Tuple<T1,T2,T3>.Equals метод и он вызывает IStructuralEquatable.Equals метод три раза. В первый раз он передает компаратор равенства по умолчанию, возвращаемый свойством EqualityComparer<T>.Default . Во второй раз он передает компаратор равенства по умолчанию, возвращаемый свойством StructuralComparisons.StructuralEqualityComparer . В третий раз он передает пользовательский NanComparer объект. Как показано в выходных данных примера, первые три вызова метода возвращают true, тогда как четвертый вызов возвращает .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

Комментарии

Структурное равенство означает, что два объекта равны, так как они имеют равные значения. Он отличается от равенства ссылок, которое указывает, что две ссылки на объекты равны, поскольку они ссылаются на один и тот же физический объект. Интерфейс IStructuralEquatable позволяет реализовать настраиваемые сравнения для проверки структурного равенства объектов коллекции. То есть можно создать собственное определение структурного равенства и указать, что это определение будет использоваться с типом коллекции, принимающей IStructuralEquatable интерфейс . Интерфейс имеет два члена: Equals, который проверяет равенство с помощью указанной IEqualityComparer реализации, и GetHashCode, который возвращает идентичные хэш-коды для равных объектов.

Примечание

Интерфейс IStructuralEquatable поддерживает только пользовательские сравнения для структурного равенства. Интерфейс IStructuralComparable поддерживает пользовательские структурные сравнения для сортировки и упорядочения.

Платформа .NET Framework также предоставляет компараторы равенства по умолчанию, возвращаемые свойствами EqualityComparer<T>.Default и StructuralComparisons.StructuralEqualityComparer . Дополнительные сведения см. в примере.

Универсальные классы кортежей (, , и т. д.) и Array класс предоставляют явные IStructuralEquatable реализации интерфейса. Tuple<T1,T2,T3>Tuple<T1,T2>Tuple<T1> Путем приведения (в C#) или преобразования (в Visual Basic) текущего экземпляра массива или кортежа в IStructuralEquatable значение интерфейса и предоставления IEqualityComparer реализации в качестве аргумента методу Equals можно определить пользовательское сравнение на равенство для массива или коллекции.

Методы

Equals(Object, IEqualityComparer)

Определяет, соблюдается ли структурное равенство между объектом и текущим экземпляром.

GetHashCode(IEqualityComparer)

Возвращает хэш-код текущего экземпляра.

Применяется к

См. также раздел