Tuple<T1,T2,T3,T4,T5,T6,T7>.IStructuralEquatable.Equals Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Vrátí hodnotu, která určuje, zda je aktuální Tuple<T1,T2,T3,T4,T5,T6,T7> objekt roven zadanému objektu na základě zadané metody porovnání.
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
Parametry
- other
- Object
Objekt k porovnání s touto instancí.
- comparer
- IEqualityComparer
Objekt, který definuje metodu, jež se má použít k vyhodnocení, zda se dané dva objekty rovnají.
Návraty
true
Pokud aktuální instance se rovná zadanému objektu; v opačném případě . false
Implementuje
Příklady
Následující příklad definuje RateComparer
třídu, která provádí vlastní test rovnosti. Pokud jsou hodnoty, které jsou předány metodě IStructuralEquatable.Equals typu Single nebo Double, metoda testuje rovnost pomocí maximálně tří desetinných míst. V opačném případě jednoduše zavolá metodu x
parametru Equals
. Příklad používá tuto IEqualityComparer implementaci k určení, zda jsou čtyři Tuple<T1,T2,T3,T4,T5,T6,T7> objekty, které obsahují data o rychlosti změn populace mezi 1950 a 2000 jsou stejné.
using System;
using System.Collections;
public class RateComparer<T1, T2, T3, T4, T5, T6, T7> : IEqualityComparer
{
private int argument = 0;
public new bool Equals(object x, object y)
{
argument++;
if (argument == 1) return true;
double fx, fy;
if (x is Double || x is Single)
{
fx = (double) x;
fy = (double) y;
return Math.Round(fx * 1000).Equals(Math.Round(fy * 1000));
}
else
{
return x.Equals(y);
}
}
public int GetHashCode(object obj)
{
if (obj is Single || obj is Double)
return Math.Round(((double) obj) * 1000).GetHashCode();
else
return obj.GetHashCode();
}
}
public class Example
{
public static void Main()
{
var rate1 = Tuple.Create("New York", -.013934, .014505,
-.1042733, .0354833, .093644, .0290792);
var rate2 = Tuple.Create("Unknown City", -.013934, .014505,
-.1042733, .0354833, .093644, .0290792);
var rate3 = Tuple.Create("Unknown City", -.013934, .014505,
-.1042733, .0354833, .093644, .029079);
var rate4 = Tuple.Create("San Francisco", -.0451934, -.0332858,
-.0512803, .0662544, .0728964, .0491912);
IStructuralEquatable eq = rate1;
// Compare first tuple with remaining two tuples.
Console.WriteLine("{0} = ", rate1.ToString());
Console.WriteLine(" {0} : {1}", rate2,
eq.Equals(rate2, new RateComparer<string, double, double, double, double, double, double>()));
Console.WriteLine(" {0} : {1}", rate3,
eq.Equals(rate3, new RateComparer<string, double, double, double, double, double, double>()));
Console.WriteLine(" {0} : {1}", rate4,
eq.Equals(rate4, new RateComparer<string, double, double,double, double, double, double>()));
}
}
// The example displays the following output:
// (New York, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) =
// (Unknown City, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) : True
// (Unknown City, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.029079) : True
// (San Francisco, -0.0451934, -0.0332858, -0.0512803, 0.0662544, 0.0728964, 0.0491912) : False
open System
open System.Collections
type RateComparer<'T1, 'T2, 'T3, 'T4, 'T5, 'T6, 'T7>() =
let mutable argument = 0
interface IEqualityComparer with
member _.Equals(x, y) =
argument <- argument + 1
if argument = 1 then
true
else
if x :? Double || x :? Single then
let fx = x :?> double
let fy = y :?> double
Math.Round(fx * 1000.).Equals(Math.Round(fy * 1000.))
else
x.Equals y
member _.GetHashCode(obj) =
if obj :? Single || obj :? Double then
Math.Round((obj :?> double) * 1000.).GetHashCode()
else
obj.GetHashCode()
let rate1 = Tuple.Create("New York", -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792)
let rate2 = Tuple.Create("Unknown City", -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792)
let rate3 = Tuple.Create("Unknown City", -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.029079)
let rate4 = Tuple.Create("San Francisco", -0.0451934, -0.0332858, -0.0512803, 0.0662544, 0.0728964, 0.0491912)
let eq: IStructuralEquatable = rate1
// Compare first tuple with remaining two tuples.
printfn $"{rate1} = "
printfn $" {rate2} : {eq.Equals(rate2, RateComparer<string, double, double, double, double, double, double>())}"
printfn $" {rate3} : {eq.Equals(rate3, RateComparer<string, double, double, double, double, double, double>())}"
printfn $" {rate4} : {eq.Equals(rate4, RateComparer<string, double, double,double, double, double, double>())}"
// The example displays the following output:
// (New York, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) =
// (Unknown City, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) : True
// (Unknown City, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.029079) : True
// (San Francisco, -0.0451934, -0.0332858, -0.0512803, 0.0662544, 0.0728964, 0.0491912) : False
Imports System.Collections
Public Class RateComparer(Of T1, T2, T3, T4, T5, T6, T7) : Implements IEqualityComparer
Private argument As Integer = 0
Public Overloads Function Equals(x As Object, y As Object) As Boolean _
Implements IEqualityComparer.Equals
argument += 1
If argument = 1 Then
Return True
Else
Dim fx, fy As Double
If typeof x Is Double Or typeof x Is Single Then
fx = CDbl(x)
fy = CDbl(y)
Return Math.Round(fx * 1000).Equals(Math.Round(fy * 1000))
Else
Return x.Equals(y)
End If
End If
End Function
Public Overloads Function GetHashCode(obj As Object) As Integer _
Implements IEqualityComparer.GetHashCode
If TypeOf(obj) Is Single Or TypeOf(obj) Is Double Then
Return Math.Round(CDbl(obj) * 1000).GetHashCode()
Else
Return obj.GetHashCode()
End If
End Function
End Class
Module Example
Public Sub Main()
Dim rate1 = Tuple.Create("New York", -.013934, .014505,
-.1042733, .0354833, .093644, .0290792)
Dim rate2 = Tuple.Create("Unknown City", -.013934, .014505,
-.1042733, .0354833, .093644, .0290792)
Dim rate3 = Tuple.Create("Unknown City", -.013934, .014505,
-.1042733, .0354833, .093644, .029079)
Dim rate4 = Tuple.Create("San Francisco", -.0451934, -.0332858,
-.0512803, .0662544, .0728964, .0491912)
Dim eq As IStructuralEquatable = rate1
' Compare first tuple with remaining two tuples.
Console.WriteLine("{0} = ", rate1.ToString())
Console.WriteLine(" {0} : {1}", rate2,
eq.Equals(rate2, New RateComparer(Of String, Double, Double, Double, Double, Double, Double)()))
Console.WriteLine(" {0} : {1}", rate3,
eq.Equals(rate3, New RateComparer(Of String, Double, Double, Double, Double, Double, Double)()))
Console.WriteLine(" {0} : {1}", rate4,
eq.Equals(rate4, New RateComparer(Of String, Double, Double, Double, Double, Double, Double)()))
End Sub
End Module
' The example displays the following output:
' (New York, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) =
' (Unknown City, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) : True
' (Unknown City, -0.013934, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.029079) : True
' (San Francisco, -0.0451934, -0.0332858, -0.0512803, 0.0662544, 0.0728964, 0.0491912) : False
Poznámky
Tento člen je explicitní implementace členu rozhraní. Lze jej použít pouze v případě, že Tuple<T1,T2,T3,T4,T5,T6,T7> je instance přetypovaná na IStructuralEquatable rozhraní.
Implementace IEqualityComparer.Equals je volána pouze v případě, že jiná není null
, a pokud je možné ji úspěšně přetypovat (v jazyce C#) nebo převést (v jazyce Visual Basic) na Tuple<T1,T2,T3,T4,T5,T6,T7> objekt, jehož komponenty jsou stejného typu jako aktuální instance. Metoda IStructuralEquatable.Equals(Object, IEqualityComparer) nejprve předá Item1 hodnoty Tuple<T1,T2,T3,T4,T5,T6,T7> objektů, které mají být porovnány s implementací IEqualityComparer.Equals . Pokud toto volání metody vrátí true
, metoda je volána znovu a předá Item2 hodnoty dvou Tuple<T1,T2,T3,T4,T5,T6,T7> objektů. To pokračuje, dokud volání metody nevrátí při false
porovnávání konkrétní dvojice Item
hodnot nebo jsou tyto dvě Item7 hodnoty předány metodě.