# Tuple<T1>.IStructuralEquatable.Equals(Object, IEqualityComparer) Method

## Definition

Returns a value that indicates whether the current Tuple<T1> object is equal to a specified object based on a specified comparison method.

`` 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);``
``Function Equals (other As Object, comparer As IEqualityComparer) As Boolean Implements IStructuralEquatable.Equals``

#### Parameters

other
Object

The object to compare with this instance.

comparer
IEqualityComparer

An object that defines the method to use to evaluate whether the two objects are equal.

#### Returns

`true` if the current instance is equal to the specified object; otherwise, `false`.

## Examples

The following example defines an IEqualityComparer implementation that considers two floating-point values to be equal if they are approximately equal to each other (that is, if one value is within .01 percent of the other).

``````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
``````
``````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
``````

## Remarks

This member is an explicit interface member implementation. It can be used only when the Tuple<T1> instance is cast to an IStructuralEquatable interface.

The IEqualityComparer.Equals implementation is called only if `other` is not `null`, and if it can be successfully cast (in C#) or converted (in Visual Basic) to a Tuple<T1> object whose single component is of the same type as the current instance. The method is passed the Item1 component of the current instance and the Item1 component of the Tuple<T1> object represented by the `other` parameter.