IStructuralEquatable Interfaz
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Define los métodos para admitir la comparación de objetos de igualdad estructural.
public interface class IStructuralEquatable
public interface IStructuralEquatable
type IStructuralEquatable = interface
Public Interface IStructuralEquatable
- Derivado
Ejemplos
El comparador de igualdad predeterminado, EqualityComparer<Object>.Default.Equals
, considera que dos NaN
valores son iguales. Sin embargo, en algunos casos, es posible que desee que la comparación de NaN
valores de igualdad devuelva false
, lo que indica que no se pueden comparar los valores. En el ejemplo siguiente se define una clase NanComparer
que implementa la interfaz IEqualityComparer . El tercer ejemplo lo usa como argumento para el Equals(Object, IEqualityComparer) método de la interfaz que implementan las IStructuralEquatable tuplas. Compara dos o dos DoubleSingle valores mediante el operador de igualdad. Pasa valores de cualquier otro tipo al comparador de igualdad predeterminado.
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
En el ejemplo siguiente se crean dos objetos de tupla 3 idénticos cuyos componentes constan de tres Double valores. El valor del segundo componente es Double.NaN. A continuación, el ejemplo llama al Tuple<T1,T2,T3>.Equals método y llama al IStructuralEquatable.Equals método tres veces. La primera vez, pasa el comparador de igualdad predeterminado devuelto por la EqualityComparer<T>.Default propiedad . La segunda vez, pasa el comparador de igualdad predeterminado devuelto por la StructuralComparisons.StructuralEqualityComparer propiedad . La tercera vez, pasa el objeto personalizado NanComparer
. Como se muestra en la salida del ejemplo, las tres primeras llamadas al método devuelven true
, mientras que la cuarta llamada devuelve 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
Comentarios
La igualdad estructural significa que dos objetos son iguales porque tienen valores iguales. Difiere de la igualdad de referencia, que indica que dos referencias de objeto son iguales porque hacen referencia al mismo objeto físico. La IStructuralEquatable interfaz permite implementar comparaciones personalizadas para comprobar la igualdad estructural de los objetos de colección. Es decir, puede crear su propia definición de igualdad estructural y especificar que esta definición se use con un tipo de colección que acepte la IStructuralEquatable interfaz. La interfaz tiene dos miembros: Equals, que comprueba la igualdad mediante una implementación especificada IEqualityComparer y GetHashCode, que devuelve códigos hash idénticos para los objetos que son iguales.
Nota
La IStructuralEquatable interfaz solo admite comparaciones personalizadas para la igualdad estructural. La IStructuralComparable interfaz admite comparaciones estructurales personalizadas para ordenar y ordenar.
.NET Framework también proporciona comparadores de igualdad predeterminados, que devuelven las EqualityComparer<T>.Default propiedades y StructuralComparisons.StructuralEqualityComparer . Para obtener más información, vea el ejemplo.
Las clases de tupla genéricas (Tuple<T1>, Tuple<T1,T2>, Tuple<T1,T2,T3>, etc.) y la Array clase proporcionan implementaciones explícitas de la IStructuralEquatable interfaz. Al convertir (en C#) o convertir (en Visual Basic) la instancia actual de una matriz o tupla en un IStructuralEquatable valor de interfaz y proporcionar la IEqualityComparer implementación como argumento al Equals método, puede definir una comparación de igualdad personalizada para la matriz o colección.
Métodos
Equals(Object, IEqualityComparer) |
Determina si un objeto es estructuralmente igual que la instancia actual. |
GetHashCode(IEqualityComparer) |
Devuelve un código hash de la instancia actual. |