Tuple<T1,T2,T3,T4,T5>.IStructuralEquatable.Equals Método
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í.
Devuelve un valor que indica si el objeto Tuple<T1,T2,T3,T4,T5> actual es igual que el objeto especificado según el método de comparación especificado.
virtual bool System.Collections.IStructuralEquatable.Equals(System::Object ^ other, System::Collections::IEqualityComparer ^ comparer) = System::Collections::IStructuralEquatable::Equals;
bool IStructuralEquatable.Equals (object other, System.Collections.IEqualityComparer comparer);
abstract member System.Collections.IStructuralEquatable.Equals : obj * System.Collections.IEqualityComparer -> bool
override this.System.Collections.IStructuralEquatable.Equals : obj * System.Collections.IEqualityComparer -> bool
Function Equals (other As Object, comparer As IEqualityComparer) As Boolean Implements IStructuralEquatable.Equals
Parámetros
- other
- Object
Objeto que se va a comparar con esta instancia.
- comparer
- IEqualityComparer
Un objeto que define el método que se usará para evaluar si los dos objetos son iguales.
Devoluciones
true
si la instancia actual es igual que el objeto especificado; en caso contrario, false
.
Implementaciones
Ejemplos
En el ejemplo siguiente se define una clase DoubleComparer
que implementa la interfaz IEqualityComparer . En el ejemplo se crean instancias de dos Tuple<T1,T2,T3,T4,T5> objetos mediante un generador de números aleatorios para rellenar su segundo a quinto componente, se convierte la primera instancia en una IStructuralEquatable interfaz y, a continuación, se usa un DoubleComparer
objeto para probar los dos Tuple<T1,T2,T3,T4,T5> objetos para lograr una igualdad aproximada.
using System;
using System.Collections;
public class DoubleComparer<T1, T2, T3, T4, T5> : IEqualityComparer
{
private double difference;
private int argument = 0;
public DoubleComparer(double difference)
{
this.difference = difference;
}
new public bool Equals(object x, object y)
{
argument += 1;
// Return true for Item1.
if (argument == 1) return true;
double d1 = (double) x;
double d2 = (double) y;
if (d1 - d2 < d1 * difference)
return true;
else
return false;
}
public int GetHashCode(object obj)
{
if (obj is T1)
return ((T1) obj).GetHashCode();
else if (obj is T2)
return ((T2) obj).GetHashCode();
else if (obj is T3)
return ((T3) obj).GetHashCode();
else if (obj is T4)
return ((T4) obj).GetHashCode();
else
return ((T5) obj).GetHashCode();
}
}
public class Example
{
public static void Main()
{
var value1 = GetValues(1);
var value2 = GetValues(2);
IStructuralEquatable iValue1 = value1;
Console.WriteLine("{0} =\n{1} :\n{2}", value1, value2,
iValue1.Equals(value2,
new DoubleComparer<int, double, double, double, double>(.01)));
}
private static Tuple<int, double, double, double, double> GetValues(int ctr)
{
// Generate four random numbers between 0 and 1
Random rnd = new Random((int)DateTime.Now.Ticks >> 32 >> ctr);
return Tuple.Create(ctr, rnd.NextDouble(), rnd.NextDouble(),
rnd.NextDouble(), rnd.NextDouble());
}
}
open System
open System.Collections
type DoubleComparer<'T1, 'T2, 'T3, 'T4, 'T5 when 'T1: equality and 'T2: equality and 'T3: equality and 'T4: equality and 'T5: equality>(difference: double) =
let mutable argument = 0
interface IEqualityComparer with
member _.Equals(x, y) =
argument <- argument + 1
// Return true for Item1.
if argument = 1 then
true
else
let d1 = x :?> double
let d2 = y :?> double
d1 - d2 < d1 * difference
member _.GetHashCode(obj) =
match obj with
| :? 'T1 as obj -> obj.GetHashCode()
| :? 'T2 as obj -> obj.GetHashCode()
| :? 'T3 as obj -> obj.GetHashCode()
| :? 'T4 as obj -> obj.GetHashCode()
| _ -> (obj :?> 'T5).GetHashCode()
let getValues ctr =
// Generate four random numbers between 0 and 1
let rnd = Random(DateTime.Now.Ticks >>> 32 >>> ctr |> int)
Tuple.Create(ctr, rnd.NextDouble(), rnd.NextDouble(), rnd.NextDouble(), rnd.NextDouble())
let value1 = getValues 1
let value2 = getValues 2
let iValue1 = value1
printfn $"{value1} =\n{value2} :\n{(DoubleComparer<int, double, double, double, double> 0.01 :> IEqualityComparer).Equals(iValue1, value2)}"
Imports System.Collections
Public Class DoubleComparer(Of T1, T2, T3, T4, T5) : Implements IEqualityComparer
Private difference As Double
Private argument As Integer = 0
Public Sub New(difference As Double)
Me.difference = difference
End Sub
Public Overloads Function Equals(x As Object, y As Object) As Boolean _
Implements IEqualityComparer.Equals
argument += 1
' Return true for Item1.
If argument = 1 Then
Return True
Else
Dim d1 As Double = CDbl(x)
Dim d2 As Double = CDbl(y)
If d1 - d2 < d1 * difference Then
Return True
Else
Return False
End If
End If
End Function
Public Overloads Function GetHashCode(obj As Object) As Integer _
Implements IEqualityComparer.GetHashCode
If TypeOf obj Is T1 Then
Return CType(obj, T1).GetHashCode()
ElseIf TypeOf obj Is T2 Then
Return CType(obj, T2).GetHashCode()
ElseIf TypeOf obj Is T3 Then
Return CType(Obj, T3).GetHashCode()
ElseIf TypeOf obj Is T4 Then
Return CType(Obj, T4).GetHashCode()
Else
Return CType(obj, T5).GetHashCode()
End If
End Function
End Class
Module Example
Public Sub Main()
Dim value1 = GetValues(1)
Dim value2 = GetValues(2)
Dim iValue1 As IStructuralEquatable = value1
Console.WriteLine("{0} ={3}{1} :{3}{2}", value1, value2, _
iValue1.Equals(value2, _
New DoubleComparer(Of Integer, Double, Double, Double, Double)(.01)), _
vbCrLf)
End Sub
Private Function GetValues(ctr As Integer) As Tuple(Of Integer, Double, Double, Double, Double)
' Generate four random numbers between 0 and 1
Dim rnd As New Random(CInt((DateTime.Now.Ticks >> 32) >> ctr))
Return Tuple.Create(ctr, rnd.NextDouble(), rnd.NextDouble(),
rnd.NextDouble(), rnd.NextDouble)
End Function
End Module
' The example displays output like the following:
' (1, 0.910850029862882, 0.894596965934428, 0.319678635019659, 0.801647342649124) =
' (2, 0.818546649915421, 0.355961162762698, 0.0438506622071614, 0.679904267042831) :
' False
Comentarios
Este miembro es una implementación explícita de un miembro de interfaz. Solo se puede utilizar cuando la instancia de Tuple<T1,T2,T3,T4,T5> se convierte en una interfaz IStructuralEquatable.
Solo se llama a la IEqualityComparer.Equals implementación si other
no null
es , y si se puede convertir correctamente (en C#) o convertir (en Visual Basic) en un Tuple<T1,T2,T3,T4,T5> objeto cuyos componentes son de los mismos tipos que la instancia actual. El IStructuralEquatable.Equals(Object, IEqualityComparer) método pasa primero los Item1 valores de los Tuple<T1,T2,T3,T4,T5> objetos que se van a comparar con la IEqualityComparer.Equals implementación. Si esta llamada al método devuelve true
, se vuelve a llamar al método y se pasan los Item2 valores de los dos Tuple<T1,T2,T3,T4,T5> objetos. Esto continúa hasta que la llamada al método devuelve false
cuando compara un par específico de Item
valores o los dos Item5 valores se pasan al método .