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


The .NET API Reference documentation has a new home. Visit the .NET API Browser on docs.microsoft.com to see the new experience.

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

Namespace:   System
Assembly:  mscorlib (in mscorlib.dll)

bool IStructuralEquatable.Equals(
	object other,
	IEqualityComparer comparer


Type: System.Object

The object to compare with this instance.

Type: System.Collections.IEqualityComparer

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

Return Value

Type: System.Boolean

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

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

The IStructuralEquatable.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, T2> object whose components are of the same types as the current instance. The IStructuralEquatable.Equals method first passes the Item1 values of the Tuple<T1, T2> objects to be compared to the IEqualityComparer.Equals implementation. If this method call returns true, the method is called again and passed the Item2 values of the two Tuple<T1, T2> objects.

The following example defines an Item2Comparer class that implements the IEqualityComparer interface and changes the way in which Tuple<T1, T2> objects are evaluated for equality. The method always returns true when it is passed the Item1 property values of two Tuple<T1, T2> objects, and it calls the IStructuralEquatable.Equals method to evaluate their Item2 property values. As a result, the method tests for equality based only on the value of the Item2 property. The output illustrates the result for a data set of Tuple<T1, T2> objects that record the names of runners and the distances that they ran.

using System;
using System.Collections;

public class Item2Comparer<T1, T2> : IEqualityComparer
   new public bool Equals(object x, object y)
      // Return true for all values of Item1.
      if (x is T1)
      //if (typeof(x) is string) 
         return true;
         return x.Equals(y);

   public int GetHashCode(object obj)
      if (obj is T1)
         return ((T1) obj).GetHashCode();
         return ((T2) obj).GetHashCode();

public class Example
   public static void Main()
      Tuple<string, double>[] distancesWalked = {
                        Tuple.Create("Jan", Double.NaN), 
                        Tuple.Create("Joe", Double.NaN), 
                        Tuple.Create("Adam", 1.36), 
                        Tuple.Create("Selena", 2.01),
                        Tuple.Create("Jake", 1.36) };
      for (int ctr = 0; ctr < distancesWalked.Length; ctr++)
         Tuple<string, double> distanceWalked = distancesWalked[ctr];
         for (int ctr2 = ctr + 1; ctr2 < distancesWalked.Length; ctr2++)
            Console.WriteLine("{0} = {1}: {2}", distanceWalked, 
                                                    new Item2Comparer<string, double>()));
// The example displays the following output:
//       (Jan, NaN) = (Joe, NaN): True
//       (Jan, NaN) = (Adam, 1.36): False
//       (Jan, NaN) = (Selena, 2.01): False
//       (Jan, NaN) = (Jake, 1.36): False
//       (Joe, NaN) = (Adam, 1.36): False
//       (Joe, NaN) = (Selena, 2.01): False
//       (Joe, NaN) = (Jake, 1.36): False
//       (Adam, 1.36) = (Selena, 2.01): False
//       (Adam, 1.36) = (Jake, 1.36): True
//       (Selena, 2.01) = (Jake, 1.36): False

Universal Windows Platform
Available since 8
.NET Framework
Available since 4.0
Portable Class Library
Supported in: portable .NET platforms
Available since 4.0
Windows Phone Silverlight
Available since 8.0
Windows Phone
Available since 8.1
Return to top