IStructuralEquatable.Equals(Object, IEqualityComparer) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Определяет, соблюдается ли структурное равенство между объектом и текущим экземпляром.
public:
bool Equals(System::Object ^ other, System::Collections::IEqualityComparer ^ comparer);
public bool Equals (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
Объект для сравнения с текущим экземпляром.
- comparer
- IEqualityComparer
Объект, определяющий, равны ли текущий экземпляр и объект other
.
Возвращаемое значение
true
, если два объекта равны; в противном случае false
.
Примеры
Компаратор EqualityComparer<Object>.Default.Equals
равенства по умолчанию считает два NaN
значения равными. Однако в некоторых случаях может потребоваться, чтобы сравнение значений NaN
для равенства возвращалось false
, что указывает на невозможность сравнения значений. В следующем примере определяется класс NanComparer
, реализующий интерфейс 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
Комментарии
Метод поддерживает пользовательское структурное сравнение объектов массива и кортежа Equals . Этот метод, в свою очередь, вызывает comparer
метод объекта IEqualityComparer.Equals для сравнения отдельных элементов массива или компонентов кортежа, начиная с первого элемента или компонента. Отдельные вызовы в IEqualityComparer.Equals конце и IStructuralEquatable.Equals метод возвращает значение при возврате вызова false
метода или после сравнения всех элементов массива или компонентов кортежа.