IStructuralEquatable Interface
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Define métodos para suportar a comparação de objetos para igualdade estrutural.
public interface class IStructuralEquatable
public interface IStructuralEquatable
type IStructuralEquatable = interface
Public Interface IStructuralEquatable
- Derivado
Exemplos
O comparador de igualdade por defeito, EqualityComparer<Object>.Default.Equals, considera dois NaN valores como iguais. No entanto, em alguns casos, pode querer que a comparação de NaN valores para igualdade devolva false, o que indica que os valores não podem ser comparados. O exemplo a seguir define uma NanComparer classe que implementa a IEqualityComparer interface. É usado pelo terceiro exemplo como argumento para o Equals(Object, IEqualityComparer) método da IStructuralEquatable interface que as tuplas implementam. Compara dois Double ou dois Single valores usando o operador de igualdade. Passa valores de qualquer outro tipo para o comparador de igualdade por defeito.
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
O exemplo seguinte cria dois objetos idênticos de 3-tuplas cujos componentes consistem em três Double valores. O valor do segundo componente é Double.NaN. O exemplo chama então o Tuple<T1,T2,T3>.Equals método, e chama-o IStructuralEquatable.Equals três vezes. Na primeira vez, passa o comparador de igualdade padrão que é devolvido pela EqualityComparer<T>.Default propriedade. Na segunda vez, passa o comparador de igualdade padrão que é devolvido pela StructuralComparisons.StructuralEqualityComparer propriedade. Na terceira vez, passa o objeto personalizado NanComparer . Como mostra a saída do exemplo, as três primeiras chamadas de método retornam true, enquanto a quarta chamada devolve 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
Observações
Igualdade estrutural significa que dois objetos são iguais porque têm valores iguais. Difere da igualdade de referência, que indica que duas referências a objetos são iguais porque fazem referência ao mesmo objeto físico. A IStructuralEquatable interface permite-lhe implementar comparações personalizadas para verificar a igualdade estrutural dos objetos da coleção. Ou seja, pode criar a sua própria definição de igualdade estrutural e especificar que essa definição seja usada com um tipo de coleção que aceite a IStructuralEquatable interface. A interface tem dois membros: Equals, que testa a igualdade usando uma implementação especificada IEqualityComparer , e GetHashCode, que devolve códigos hash idênticos para objetos iguais.
Note
A IStructuralEquatable interface suporta apenas comparações personalizadas para igualdade estrutural. A IStructuralComparable interface suporta comparações estruturais personalizadas para ordenação e ordenação.
O .NET Framework também fornece comparadores de igualdade por defeito, que são devolvidos pelas propriedades EqualityComparer<T>.Default e StructuralComparisons.StructuralEqualityComparer. Para mais informações, consulte o exemplo.
As classes genéricas de tuplas (Tuple<T1>, Tuple<T1,T2>, Tuple<T1,T2,T3>, e assim sucessivamente) e a Array classe fornecem implementações explícitas da IStructuralEquatable interface. Ao castar (em C#) ou converter (em Visual Basic) a instância atual de um array ou tupla num valor de interface IStructuralEquatable e fornecer a sua implementação IEqualityComparer como argumento para o método Equals, pode definir uma comparação de igualdade personalizada para o array ou coleção.
Métodos
| Name | Description |
|---|---|
| Equals(Object, IEqualityComparer) |
Determina se um objeto é estruturalmente igual à instância atual. |
| GetHashCode(IEqualityComparer) |
Devolve um código hash para a instância atual. |