Tuple<T1>.IStructuralEquatable.Equals(Object, IEqualityComparer) Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Zwraca wartość wskazującą, czy bieżący Tuple<T1> obiekt jest równy określonemu obiektowi na podstawie określonej metody porównania.
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
Obiekt, który ma zostać porównany z tym wystąpieniem.
- comparer
- IEqualityComparer
Obiekt definiujący metodę służącą ocenie, czy dwa obiekty są sobie równe.
Zwraca
true
jeśli bieżące wystąpienie jest równe określonemu obiektowi; w przeciwnym razie , false
.
Implementuje
Przykłady
Poniższy przykład definiuje implementację IEqualityComparer , która uwzględnia dwie wartości zmiennoprzecinkowe, które mają być równe, jeśli są one w przybliżeniu równe sobie (oznacza to, że jedna wartość mieści się w 01 procentach drugiego).
using System;
using System.Collections;
public class Tuple1Comparer : IEqualityComparer
{
new public bool Equals(object x, object y)
{
// Check if x is a floating point type. If x is, then y is.
if (x is double | x is float)
{
// Convert to Double values.
double dblX = (double) x;
double dblY = (double) y;
if (Double.IsNaN(dblX) | Double.IsInfinity(dblX) |
Double.IsNaN(dblY) | Double.IsInfinity(dblY))
return dblX.Equals(dblY);
else
return Math.Abs(dblX - dblY) <= dblX * .0001;
}
else
{
return x.Equals(y);
}
}
public int GetHashCode(object obj)
{
return obj.GetHashCode();
}
}
public class Example
{
public static void Main()
{
var doubleTuple1 = Tuple.Create(12.3455);
var doubleTuple2 = Tuple.Create(16.8912);
var doubleTuple3 = Tuple.Create(12.3449599);
// Compare first tuple with a Tuple<double> with a different value.
TestEquality(doubleTuple1, doubleTuple2);
//Compare first tuple with a Tuple<double> with the same value.
TestEquality(doubleTuple1, doubleTuple3);
}
private static void TestEquality(Tuple<double> tuple, object obj)
{
Console.WriteLine("{0} = {1}: {2}", tuple.ToString(),
obj.ToString(),
((IStructuralEquatable)tuple).Equals(obj, new Tuple1Comparer()));
}
}
// The example displays the following output:
// (12.3455) = (16.8912): False
// (12.3455) = (12.3449599): True
open System
open System.Collections
type Tuple1Comparer() =
interface IEqualityComparer with
member _.Equals(x: obj, y: obj) =
match x with
| :? double as dblX ->
// Convert to Double values.
let dblY = y :?> double
if Double.IsNaN dblX || Double.IsInfinity dblX ||
Double.IsNaN dblY || Double.IsInfinity dblY then
dblX.Equals dblY
else
abs (dblX - dblY) <= dblX * 0.0001
| _ ->
x.Equals y
member _.GetHashCode(obj: obj) =
obj.GetHashCode()
let testEquality (tuple: Tuple<double>) (obj: obj) =
printfn $"{tuple} = {obj}: {(tuple :> IStructuralEquatable).Equals(obj, Tuple1Comparer())}"
let doubleTuple1 = Tuple.Create 12.3455
let doubleTuple2 = Tuple.Create 16.8912
let doubleTuple3 = Tuple.Create 12.3449599
// Compare first tuple with a Tuple<double> with a different value.
testEquality doubleTuple1 doubleTuple2
//Compare first tuple with a Tuple<double> with the same value.
testEquality doubleTuple1 doubleTuple3
// The example displays the following output:
// (12.3455) = (16.8912): False
// (12.3455) = (12.3449599): True
Imports System.Collections
Public Class Tuple1Comparer : Implements IEqualityComparer
Public Overloads Function Equals(x As Object, y As Object) As Boolean _
Implements IEqualityComparer.Equals
' Check if x is a floating point type. If x is, then y is.
If TypeOf x Is Double Or TypeOf x Is Single Then
' Convert to Double values.
Dim dblX As Double = CDbl(x)
Dim dblY As Double = CDbl(y)
If Double.IsNan(dblX) Or Double.IsInfinity(dblX) Or _
Double.IsNan(dblY) Or Double.IsInfinity(dblY) Then
Return dblX.Equals(dblY)
Else
Return Math.Abs(dblX - dblY) <= dblY * .0001
End If
Else
Return x.Equals(y)
End If
End Function
Public Overloads Function GetHashCode(obj As Object) As Integer _
Implements IEqualityComparer.GetHashCode
Return obj.GetHashCode()
End Function
End Class
Module Example
Public Sub Main()
Dim doubleTuple1 = Tuple.Create(12.3455)
Dim doubleTuple2 = Tuple.Create(16.8912)
Dim doubleTuple3 = Tuple.Create(12.3449599)
' Compare first tuple with a Tuple(Of Double) with a different value.
TestEquality(doubleTuple1, doubleTuple2)
' Compare first tuple with a Tuple(Of Double) with the same value.
TestEquality(doubleTuple1, doubleTuple3)
End Sub
Private Sub TestEquality(tuple As Tuple(Of Double), obj As Object)
Try
Console.WriteLine("{0} = {1}: {2}", tuple.ToString(),
obj.ToString,
DirectCAst(tuple, IStructuralEquatable).Equals(obj, New Tuple1Comparer()))
Catch e As ArgumentException
If obj.GetType.IsGenericType Then
If obj.GetType().Name = "Tuple`1" Then
Console.WriteLine("Cannot compare a Tuple(Of {0}) with a Tuple(Of {1}).",
tuple.Item1.GetType().Name, obj.Item1.GetType().Name)
Else
Console.WriteLine("Cannot compare a {0} with a {1}.", tuple.GetType().Name,
obj.GetType().Name)
End If
Else
Console.WriteLine("Cannot compare a {0} with a {1}.", tuple.GetType().Name,
obj.GetType().Name)
End If
End Try
End Sub
End Module
' The example displays the following output:
' (12.3455) = (16.8912): False
' (12.3455) = (12.3449599): True
Uwagi
Ten element jest jawną implementacją członków. Można go używać tylko wtedy, gdy Tuple<T1> wystąpienie jest rzutowanie do interfejsu IStructuralEquatable .
Implementacja jest wywoływana IEqualityComparer.Equals tylko wtedy, gdy other
nie null
jest , a jeśli można ją pomyślnie rzutować (w języku C#) lub przekonwertować (w Visual Basic) na Tuple<T1> obiekt, którego pojedynczy składnik jest tego samego typu co bieżące wystąpienie. Metoda jest przekazywana Item1 składnik bieżącego wystąpienia i Item1 składnika Tuple<T1> obiektu reprezentowanego other
przez parametr .