Tuple<T1,T2,T3,T4,T5>.IStructuralEquatable.Equals Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Retourneert een waarde die aangeeft of het huidige Tuple<T1,T2,T3,T4,T5> object gelijk is aan een opgegeven object op basis van een opgegeven vergelijkingsmethode.
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
Parameters
- other
- Object
Het object dat moet worden vergeleken met dit exemplaar.
- comparer
- IEqualityComparer
Een object dat de methode definieert die moet worden gebruikt om te evalueren of de twee objecten gelijk zijn.
Retouren
true als het huidige exemplaar gelijk is aan het opgegeven object; anders, false.
Implementeringen
Voorbeelden
In het volgende voorbeeld wordt een DoubleComparer klasse gedefinieerd waarmee de IEqualityComparer interface wordt geïmplementeerd. In het voorbeeld worden twee Tuple<T1,T2,T3,T4,T5> objecten geïnstitueerd met behulp van een generator voor willekeurige getallen om hun tweede tot en met vijfde onderdelen te vullen, het eerste exemplaar naar een IStructuralEquatable interface te casten en vervolgens een DoubleComparer object te gebruiken om de twee Tuple<T1,T2,T3,T4,T5> objecten te testen op benadering van gelijkheid.
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
Opmerkingen
Dit lid is een expliciete implementatie van interfaceleden. Deze kan alleen worden gebruikt wanneer het Tuple<T1,T2,T3,T4,T5> exemplaar naar een IStructuralEquatable interface wordt gecast.
De IEqualityComparer.Equals-implementatie wordt alleen aangeroepen als other niet is null en als deze kan worden geconverteerd (in C#) of geconverteerd (in Visual Basic) naar een Tuple<T1,T2,T3,T4,T5>-object waarvan de onderdelen van dezelfde typen zijn als het huidige exemplaar. De IStructuralEquatable.Equals(Object, IEqualityComparer) methode geeft eerst de Item1 waarden van de Tuple<T1,T2,T3,T4,T5> objecten door die moeten worden vergeleken met de IEqualityComparer.Equals implementatie. Als deze methode-aanroep retourneert true, wordt de methode opnieuw aangeroepen en worden de Item2 waarden van de twee Tuple<T1,T2,T3,T4,T5> objecten doorgegeven. Dit gaat door totdat de methode-aanroep wordt geretourneerd false wanneer een specifiek paar Item waarden wordt vergeleken, of de twee Item5 waarden worden doorgegeven aan de methode.