Tuple<T1,T2,T3,T4,T5,T6>.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á označuje, zda je aktuální Tuple<T1,T2,T3,T4,T5,T6> 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 je aktuální instance rovna 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í pouze tří desetinných číslic. Jinak jednoduše volá metodu parametru x
Equals
. Tento příklad používá tuto IEqualityComparer implementaci k určení, zda jsou čtyři Tuple<T1,T2,T3,T4,T5,T6> objekty, které obsahují data o míře změny populace mezi 1960 a 2000.
using System;
using System.Collections;
public class RateComparer<T1, T2, T3, T4, T5, T6> : 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", .014505, -.1042733,
.0354833, .093644, .0290792);
var rate2 = Tuple.Create("Unknown City", .014505, -.1042733,
.0354833, .093644, .0290792);
var rate3 = Tuple.Create("Unknown City", .014505, -.1042733,
.0354833, .093644, .029079);
var rate4 = Tuple.Create("San Francisco", -.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>()));
Console.WriteLine(" {0} : {1}", rate3,
eq.Equals(rate3, new RateComparer<string, double, double, double, double, double>()));
Console.WriteLine(" {0} : {1}", rate4,
eq.Equals(rate4, new RateComparer<string, double, double, double, double, double>()));
}
}
// The example displays the following output:
// (New York, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) =
// (Unknown City, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) : True
// (Unknown City, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.029079) : True
// (San Francisco, -0.0332858, -0.0512803, 0.0662544, 0.0728964, 0.0491912) : False
open System
open System.Collections
type RateComparer<'T1, 'T2, 'T3, 'T4, 'T5, 'T6>() =
let mutable argument = 0
interface IEqualityComparer with
member _.Equals(x, y) =
argument <- argument + 1
if argument = 1 then true
else
match x with
| :? double as fx ->
let fy = y :?> double
Math.Round(fx * 1000.).Equals(Math.Round(fy * 1000.))
| _ ->
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.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792)
let rate2 = Tuple.Create("Unknown City", 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792)
let rate3 = Tuple.Create("Unknown City", 0.014505, -0.1042733, 0.0354833, 0.093644, 0.029079)
let rate4 = Tuple.Create("San Francisco", -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>())}"
printfn $" {rate3} : {eq.Equals(rate3, RateComparer<string, double, double, double, double, double>())}"
printfn $" {rate4} : {eq.Equals(rate4, RateComparer<string, double, double, double, double, double>())}"
// The example displays the following output:
// (New York, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) =
// (Unknown City, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) : True
// (Unknown City, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.029079) : True
// (San Francisco, -0.0332858, -0.0512803, 0.0662544, 0.0728964, 0.0491912) : False
Imports System.Collections
Public Class RateComparer(Of T1, T2, T3, T4, T5, T6) : 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", .014505, -.1042733,
.0354833, .093644, .0290792)
Dim rate2 = Tuple.Create("Unknown City", .014505, -.1042733,
.0354833, .093644, .0290792)
Dim rate3 = Tuple.Create("Unknown City", .014505, -.1042733,
.0354833, .093644, .029079)
Dim rate4 = Tuple.Create("San Francisco", -.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)()))
Console.WriteLine(" {0} : {1}", rate3,
eq.Equals(rate3, New RateComparer(Of String, Double, Double, Double, Double, Double)()))
Console.WriteLine(" {0} : {1}", rate4,
eq.Equals(rate4, New RateComparer(Of String, Double, Double, Double, Double, Double)()))
End Sub
End Module
' The example displays the following output:
' (New York, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) =
' (Unknown City, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.0290792) : True
' (Unknown City, 0.014505, -0.1042733, 0.0354833, 0.093644, 0.029079) : True
' (San Francisco, -0.0332858, -0.0512803, 0.0662544, 0.0728964, 0.0491912) : False
Poznámky
Tento člen je explicitní implementace členu rozhraní. Lze ho Tuple<T1,T2,T3,T4,T5,T6> použít pouze v případě, že je instance přetypována do IStructuralEquatable rozhraní.
Implementace IEqualityComparer.Equals se volá pouze v případě, že other
není null
, a pokud je možné ji úspěšně přetypovat (v jazyce C#) nebo převést (v Visual Basic) na Tuple<T1,T2,T3,T4,T5,T6> objekt, jehož součásti jsou stejné typy jako aktuální instance. Metoda IStructuralEquatable.Equals(Object, IEqualityComparer) nejprve předává Item1 hodnoty Tuple<T1,T2,T3,T4,T5,T6> objektů, které se mají porovnat s implementací IEqualityComparer.Equals . Pokud volání této metody vrátí true
, metoda je volána znovu a předána Item2 hodnoty dvou Tuple<T1,T2,T3,T4,T5,T6> objektů. To pokračuje, dokud volání metody nevrátí false
, když porovná konkrétní dvojici Item
hodnot, nebo se tyto dvě Item6 hodnoty předají metodě.