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.