IStructuralEquatable.Equals(Object, IEqualityComparer) Метод

Определение

Определяет, соблюдается ли структурное равенство между объектом и текущим экземпляром.Determines whether an object is structurally equal to the current instance.

public:
 bool Equals(System::Object ^ other, System::Collections::IEqualityComparer ^ comparer);
public bool Equals (object other, System.Collections.IEqualityComparer comparer);
abstract member Equals : obj * System.Collections.IEqualityComparer -> bool
Public Function Equals (other As Object, comparer As IEqualityComparer) As Boolean

Параметры

other
Object

Объект для сравнения с текущим экземпляром.The object to compare with the current instance.

comparer
IEqualityComparer

Объект, определяющий, равны ли текущий экземпляр и объект other.An object that determines whether the current instance and other are equal.

Возвраты

Значение true, если эти два объекта равны; в противном случае — значение false.true if the two objects are equal; otherwise, false.

Примеры

По умолчанию компаратор проверки на равенство, EqualityComparer<Object>.Default.Equals, считает, что два значения NaN считаются равными.The default equality comparer, EqualityComparer<Object>.Default.Equals, considers two NaN values to be equal. Однако в некоторых случаях может потребоваться сравнение значений NaN, чтобы равенство возвращало false, что означает, что значения не могут быть сравнивались.However, in some cases, you may want the comparison of NaN values for equality to return false, which indicates that the values cannot be compared. В следующем примере определяется класс NanComparer , реализующий интерфейс IStructuralEquatable .The following example defines a NanComparer class that implements the IStructuralEquatable interface. Он сравнивает два значения Double или два Single с помощью оператора равенства.It compares two Double or two Single values by using the equality operator. Он передает значения любого другого типа в компаратор проверки на равенство по умолчанию.It passes values of any other type to the default equality comparer.

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.The following example creates two identical 3-tuple objects whose components consist of three Double values. Значение второго компонента — Double.NaN.The value of the second component is Double.NaN. Затем в примере вызывается метод Tuple<T1,T2,T3>.Equals, который вызывает метод IStructuralEquatable.Equals три раза.The example then calls the Tuple<T1,T2,T3>.Equals method, and it calls the IStructuralEquatable.Equals method three times. В первый раз он передает компаратор проверки на равенство по умолчанию, возвращаемый свойством EqualityComparer<T>.Default.The first time, it passes the default equality comparer that is returned by the EqualityComparer<T>.Default property. Второй раз он передает компаратор проверки на равенство по умолчанию, возвращаемый свойством StructuralComparisons.StructuralEqualityComparer.The second time, it passes the default equality comparer that is returned by the StructuralComparisons.StructuralEqualityComparer property. В третье время он передает пользовательский объект NanComparer.The third time, it passes the custom NanComparer object. Как видно из выходных данных в примере, первые три вызова метода возвращают true, тогда как четвертый вызов возвращает false.As the output from the example shows, the first three method calls return true, whereas the fourth call returns 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

Комментарии

Метод Equals поддерживает пользовательское структурное сравнение объектов Array и Tuple.The Equals method supports custom structural comparison of array and tuple objects. Этот метод, в свою очередь, вызывает метод IEqualityComparer.Equals объекта comparer для сравнения отдельных элементов массива или компонентов кортежа, начиная с первого элемента или компонента.This method in turn calls the comparer object's IEqualityComparer.Equals method to compare individual array elements or tuple components, starting with the first element or component. Отдельные вызовы IEqualityComparer.Equals и метод IStructuralEquatable.Equals возвращают значение, если вызов метода возвращает false или после сравнения всех элементов массива или компонентов кортежа.The individual calls to IEqualityComparer.Equals end and the IStructuralEquatable.Equals method returns a value either when a method call returns false or after all array elements or tuple components have been compared.

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

Дополнительно