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) |
Возвращает хэш-код текущего экземпляра. |