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


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 к методу интерфейса, реализующего кортежи. Он сравнивает два или два DoubleSingle значения с помощью оператора равенства. Он передает значения любого другого типа в средство сравнения равенства по умолчанию.

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. Дополнительные сведения см. в примере.

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

Методы

Имя Описание
Equals(Object, IEqualityComparer)

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

GetHashCode(IEqualityComparer)

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

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

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